diff --git a/.gitignore b/.gitignore index 5471744..275c2b6 100644 --- a/.gitignore +++ b/.gitignore @@ -4,8 +4,3 @@ /assimp-f849f6d9bd21efe802fa456184b1c3173e74a050-free.tar.bz2 /assimp-3.1.1_no_test_models.zip /assimp-c318d648ff73aa2e32b783709d69740ac3e8c072-free.tar.bz2 -/assimp-5.0.1-free.tar.xz -/assimp-5.2.5-free.tar.xz -/assimp-5.3.1-free.tar.xz -/assimp-5.4.3-free.tar.xz -/assimp-6.0.2-free.tar.xz diff --git a/0001-Apply-mechanism-to-decide-use-for-IrrXML-external-or.patch b/0001-Apply-mechanism-to-decide-use-for-IrrXML-external-or.patch new file mode 100644 index 0000000..c3d7a9b --- /dev/null +++ b/0001-Apply-mechanism-to-decide-use-for-IrrXML-external-or.patch @@ -0,0 +1,286 @@ +From a52bb1d9b030ee888ab44b8ad9a2a2b8ebb909a3 Mon Sep 17 00:00:00 2001 +From: Helio Chissini de Castro +Date: Thu, 27 Apr 2017 17:19:51 +0200 +Subject: [PATCH] - Apply mechanism to decide use for IrrXML external or + internal + +Several distributions usually decide for shared external libraries +instead of an usual embedded, for security reasons, duplicatiion issues. +This change enable the possibility to set SYSTEM_IRRXML=ON for detect +and build against a system installed irrxml. +By default, the internal copy is compiled. + +Changes on build: +- Added a FindIrrXML cmake module. +- Moved the source recipe for proper CMakeLists inside contrib directory +- Includes aren't path based anymore, using the provided INCLUDE_DIR +- Compiler option are grouped in a singled entry on main CMakeLists +--- + CMakeLists.txt | 88 +++++++++++++++++++++++++++++++++++------- + cmake-modules/FindIrrXML.cmake | 17 ++++++++ + code/CMakeLists.txt | 20 +++------- + code/irrXMLWrapper.h | 6 +-- + contrib/CMakeLists.txt | 4 ++ + contrib/irrXML/CMakeLists.txt | 13 +++++++ + 6 files changed, 116 insertions(+), 32 deletions(-) + create mode 100644 cmake-modules/FindIrrXML.cmake + create mode 100644 contrib/CMakeLists.txt + create mode 100644 contrib/irrXML/CMakeLists.txt + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 6989510..c2b3faa 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -39,7 +39,65 @@ SET(CMAKE_LEGACY_CYGWIN_WIN32 0) # Remove when CMake >= 2.8.4 is required + cmake_minimum_required( VERSION 2.8 ) + PROJECT( Assimp ) + +-OPTION(BUILD_SHARED_LIBS "Build package with shared libraries." ON) ++# All supported options ############################################### ++OPTION( BUILD_SHARED_LIBS ++ "Build package with shared libraries." ++ ON ++) ++OPTION( ASSIMP_DOUBLE_PRECISION ++ "Set to ON to enable double precision processing" ++ OFF ++) ++OPTION( ASSIMP_OPT_BUILD_PACKAGES ++ "Set to ON to generate CPack configuration files and packaging targets" ++ OFF ++) ++OPTION( ASSIMP_ANDROID_JNIIOSYSTEM ++ "Android JNI IOSystem support is active" ++ OFF ++) ++OPTION( ASSIMP_NO_EXPORT ++ "Disable Assimp's export functionality." ++ OFF ++) ++OPTION( ASSIMP_BUILD_ZLIB ++ "Build your own zlib" ++ OFF ++) ++option( ASSIMP_BUILD_ASSIMP_TOOLS ++ "If the supplementary tools for Assimp are built in addition to the library." ++ ON ++) ++option ( ASSIMP_BUILD_SAMPLES ++ "If the official samples are built as well (needs Glut)." ++ OFF ++) ++OPTION ( ASSIMP_BUILD_TESTS ++ "If the test suite for Assimp is built in addition to the library." ++ ON ++) ++OPTION ( ASSIMP_COVERALLS ++ "Eańable this to measure test coverage." ++ OFF ++) ++ ++option ( SYSTEM_IRRXML ++ "Use system installed Irrlicht/IrrXML library." ++ OFF ++) ++ ++#OPTION ( BUILD_DOCS ++# "Build documentation using Doxygen." ++# OFF ++#) ++ ++IF(MSVC) ++ set (CMAKE_PREFIX_PATH "D:\\libs\\devil") ++ OPTION( ASSIMP_INSTALL_PDB ++ "Install MSVC debug files." ++ ON ++ ) ++ENDIF(MSVC) + + IF(NOT BUILD_SHARED_LIBS) + SET(LINK_SEARCH_START_STATIC TRUE) +@@ -116,17 +174,17 @@ IF( UNIX ) + include(GNUInstallDirs) + ENDIF( UNIX ) + +-IF((CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) AND NOT CMAKE_COMPILER_IS_MINGW) +- IF (BUILD_SHARED_LIBS AND CMAKE_SIZEOF_VOID_P EQUAL 8) # -fPIC is only required for shared libs on 64 bit +- SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") +- ENDIF() ++# Grouped compiler settings ++IF ((CMAKE_C_COMPILER_ID MATCHES "GNU") AND NOT CMAKE_COMPILER_IS_MINGW) + # hide all not-exported symbols +- SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden -Wall -std=c++0x" ) ++ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fvisibility=hidden -fPIC -Wall -std=c++0x" ) ++ SET(LIBSTDC++_LIBRARIES -lstdc++) ++ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC" ) + ELSEIF(MSVC) + # enable multi-core compilation with MSVC + add_compile_options(/MP) +-ELSEIF ( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" ) +- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden -Wall -Wno-long-long -pedantic -std=c++11" ) ++ELSEIF ( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" ) ++ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fvisibility=hidden -fPIC -Wall -Wno-long-long -pedantic -std=c++11" ) + ELSEIF( CMAKE_COMPILER_IS_MINGW ) + SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden -Wall -Wno-long-long -pedantic -std=c++11" ) + ENDIF() +@@ -176,14 +233,14 @@ install(FILES "${CMAKE_CURRENT_BINARY_DIR}/assimp-config.cmake" "${C + + FIND_PACKAGE( DirectX ) + +-OPTION ( ASSIMP_NO_EXPORT +- "Disable Assimp's export functionality." +- OFF +-) ++#IF( BUILD_DOCS ) ++# add_subdirectory(doc) ++#ENDIF( BUILD_DOCS ) + +-IF( CMAKE_COMPILER_IS_GNUCXX ) +- SET(LIBSTDC++_LIBRARIES -lstdc++) +-ENDIF( CMAKE_COMPILER_IS_GNUCXX ) ++# Look for system installed irrXML ++IF ( SYSTEM_IRRXML ) ++ find_package( IrrXML REQUIRED ) ++ENDIF( SYSTEM_IRRXML ) + + # Search for external dependencies, and build them from source if not found + # Search for zlib +@@ -287,6 +344,7 @@ ELSE (ASSIMP_BUILD_NONFREE_C4D_IMPORTER) + ADD_DEFINITIONS( -DASSIMP_BUILD_NO_C4D_IMPORTER ) + ENDIF (ASSIMP_BUILD_NONFREE_C4D_IMPORTER) + ++ADD_SUBDIRECTORY(contrib) + + ADD_SUBDIRECTORY( code/ ) + option ( ASSIMP_BUILD_ASSIMP_TOOLS +diff --git a/cmake-modules/FindIrrXML.cmake b/cmake-modules/FindIrrXML.cmake +new file mode 100644 +index 0000000..5434e0b +--- /dev/null ++++ b/cmake-modules/FindIrrXML.cmake +@@ -0,0 +1,17 @@ ++# Find IrrXMl from irrlicht project ++# ++# Find LibIrrXML headers and library ++# ++# IRRXML_FOUND - IrrXML found ++# IRRXML_INCLUDE_DIR - Headers location ++# IRRXML_LIBRARY - IrrXML main library ++ ++find_path(IRRXML_INCLUDE_DIR irrXML.h ++ PATH_SUFFIXES include/irrlicht include/irrxml) ++find_library(IRRXML_LIBRARY IrrXML) ++ ++include(FindPackageHandleStandardArgs) ++find_package_handle_standard_args(IrrXML REQUIRED_VARS IRRXML_INCLUDE_DIR IRRXML_LIBRARY) ++ ++ ++mark_as_advanced(IRRXML_INCLUDE_DIR IRRXML_LIBRARY) +diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt +index 35ecf50..52073d1 100644 +--- a/code/CMakeLists.txt ++++ b/code/CMakeLists.txt +@@ -542,6 +542,9 @@ SET( PostProcessing_SRCS + ) + SOURCE_GROUP( PostProcessing FILES ${PostProcessing_SRCS}) + ++SET( IrrXML_SRCS irrXMLWrapper.h ) ++SOURCE_GROUP( IrrXML FILES ${IrrXML_SRCS}) ++ + ADD_ASSIMP_IMPORTER( Q3D + Q3DLoader.cpp + Q3DLoader.h +@@ -637,18 +640,6 @@ SET( Extra_SRCS + ) + SOURCE_GROUP( Extra FILES ${Extra_SRCS}) + +-SET( IrrXML_SRCS +- irrXMLWrapper.h +- ../contrib/irrXML/CXMLReaderImpl.h +- ../contrib/irrXML/heapsort.h +- ../contrib/irrXML/irrArray.h +- ../contrib/irrXML/irrString.h +- ../contrib/irrXML/irrTypes.h +- ../contrib/irrXML/irrXML.cpp +- ../contrib/irrXML/irrXML.h +-) +-SOURCE_GROUP( IrrXML FILES ${IrrXML_SRCS}) +- + SET( ConvertUTF_SRCS + ../contrib/ConvertUTF/ConvertUTF.h + ../contrib/ConvertUTF/ConvertUTF.c +@@ -756,7 +747,8 @@ SET( assimp_src + ADD_DEFINITIONS( -DOPENDDLPARSER_BUILD ) + + INCLUDE_DIRECTORIES( +- ../contrib/openddlparser/include ++ ${IRRXML_INCLUDE_DIR} ++ ../contrib/openddlparser/include + ) + + IF (ASSIMP_BUILD_NONFREE_C4D_IMPORTER) +@@ -766,7 +758,7 @@ ENDIF (ASSIMP_BUILD_NONFREE_C4D_IMPORTER) + + ADD_LIBRARY( assimp ${assimp_src} ) + +-TARGET_LINK_LIBRARIES(assimp ${ZLIB_LIBRARIES} ${OPENDDL_PARSER_LIBRARIES} ) ++TARGET_LINK_LIBRARIES(assimp ${ZLIB_LIBRARIES} ${OPENDDL_PARSER_LIBRARIES} ${IRRXML_LIBRARY} ) + + if(ANDROID AND ASSIMP_ANDROID_JNIIOSYSTEM) + set(ASSIMP_ANDROID_JNIIOSYSTEM_PATH port/AndroidJNI) +diff --git a/code/irrXMLWrapper.h b/code/irrXMLWrapper.h +index 41e4188..9d96456 100644 +--- a/code/irrXMLWrapper.h ++++ b/code/irrXMLWrapper.h +@@ -42,7 +42,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #define INCLUDED_AI_IRRXML_WRAPPER + + // some long includes .... +-#include "./../contrib/irrXML/irrXML.h" ++#include + #include "./../include/assimp/IOStream.hpp" + #include "BaseImporter.h" + #include +@@ -128,8 +128,8 @@ public: + + // ---------------------------------------------------------------------------------- + //! Returns size of file in bytes +- virtual int getSize() { +- return (int)data.size(); ++ virtual long getSize() const { ++ return (long)data.size(); + } + + private: +diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt +new file mode 100644 +index 0000000..362f165 +--- /dev/null ++++ b/contrib/CMakeLists.txt +@@ -0,0 +1,4 @@ ++# Compile internal irrXML only if system is not requested ++if( NOT SYSTEM_IRRXML ) ++ add_subdirectory(irrXML) ++endif( NOT SYSTEM_IRRXML ) +diff --git a/contrib/irrXML/CMakeLists.txt b/contrib/irrXML/CMakeLists.txt +new file mode 100644 +index 0000000..82ede3a +--- /dev/null ++++ b/contrib/irrXML/CMakeLists.txt +@@ -0,0 +1,13 @@ ++set( IrrXML_SRCS ++ CXMLReaderImpl.h ++ heapsort.h ++ irrArray.h ++ irrString.h ++ irrTypes.h ++ irrXML.cpp ++ irrXML.h ++) ++ ++add_library(IrrXML STATIC ${IrrXML_SRCS}) ++set(IRRXML_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}" CACHE INTERNAL "IrrXML_Include" ) ++set(IRRXML_LIBRARY "IrrXML" CACHE INTERNAL "IrrXML" ) +-- +2.9.3 + diff --git a/0001-Assimp-cmake-provider-fix.patch b/0001-Assimp-cmake-provider-fix.patch new file mode 100644 index 0000000..e3567a1 --- /dev/null +++ b/0001-Assimp-cmake-provider-fix.patch @@ -0,0 +1,39 @@ +From 584a0923a3c78304974eb05930fbb908edbc8c8c Mon Sep 17 00:00:00 2001 +From: Helio Chissini de Castro +Date: Tue, 18 Apr 2017 19:21:30 +0200 +Subject: [PATCH] Assimp cmake provider fix + +--- + assimp-config.cmake.in | 9 +++------ + 1 file changed, 3 insertions(+), 6 deletions(-) + +diff --git a/assimp-config.cmake.in b/assimp-config.cmake.in +index e06cc10..9224b9b 100644 +--- a/assimp-config.cmake.in ++++ b/assimp-config.cmake.in +@@ -10,10 +10,7 @@ + # ASSIMP_LIBRARY_DIRS - link directories + # ASSIMP_LIBRARIES - libraries to link plugins with + # ASSIMP_Boost_VERSION - the boost version assimp was compiled with +-get_filename_component(_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH) +-get_filename_component(_PREFIX "${_PREFIX}" PATH) +-get_filename_component(_PREFIX "${_PREFIX}" PATH) +-get_filename_component(ASSIMP_ROOT_DIR "${_PREFIX}" PATH) ++set(ASSIMP_ROOT_DIR "@CMAKE_INSTALL_PREFIX@") + + if( MSVC ) + # in order to prevent DLL hell, each of the DLLs have to be suffixed with the major version and msvc prefix +@@ -45,8 +42,8 @@ if( WIN32 ) + set( ASSIMP_CXX_FLAGS " -DBOOST_ALL_DYN_LINK -DBOOST_ALL_NO_LIB") + endif() + set( ASSIMP_LINK_FLAGS "" ) +-set( ASSIMP_LIBRARY_DIRS "${ASSIMP_ROOT_DIR}/@ASSIMP_LIB_INSTALL_DIR@") +-set( ASSIMP_INCLUDE_DIRS "${ASSIMP_ROOT_DIR}/@ASSIMP_INCLUDE_INSTALL_DIR@") ++set( ASSIMP_LIBRARY_DIRS "@ASSIMP_LIB_INSTALL_DIR@") ++set( ASSIMP_INCLUDE_DIRS "@ASSIMP_INCLUDE_INSTALL_DIR@") + set( ASSIMP_LIBRARIES assimp${ASSIMP_LIBRARY_SUFFIX}) + set( ASSIMP_LIBRARIES ${ASSIMP_LIBRARIES}@CMAKE_DEBUG_POSTFIX@) + +-- +2.9.3 + diff --git a/0001-Enable-doxygen-been-properly-used-from-cmake-build-a.patch b/0001-Enable-doxygen-been-properly-used-from-cmake-build-a.patch new file mode 100644 index 0000000..dd009bf --- /dev/null +++ b/0001-Enable-doxygen-been-properly-used-from-cmake-build-a.patch @@ -0,0 +1,221 @@ +From c63f886c9d12b88fc65afcd379bb086984dd44c2 Mon Sep 17 00:00:00 2001 +From: Helio Chissini de Castro +Date: Tue, 18 Apr 2017 14:51:17 +0200 +Subject: [PATCH] Enable doxygen been properly used from cmake build and + install. + +Current documentation lacks a proper directory handling and switch for +Unix like systems. +The option BUILD_DOCS are added as disable by default, even so the +Doxyfile file is generated for a manual build. + +Option HTML_OUTPUT are made cached to be properly replaced, as usually +done by some Linux distributions + +Microsoft CHM option is enabled if MSVC is detected. +--- + CMakeLists.txt | 11 ++++++++++ + doc/CMakeLists.txt | 47 +++++++++++++++++++++++++++++++++++++++++++ + doc/{Doxyfile => Doxyfile.in} | 46 ++++++++++-------------------------------- + 3 files changed, 69 insertions(+), 35 deletions(-) + create mode 100644 doc/CMakeLists.txt + rename doc/{Doxyfile => Doxyfile.in} (98%) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 8455bb8..6989510 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -40,6 +40,7 @@ cmake_minimum_required( VERSION 2.8 ) + PROJECT( Assimp ) + + OPTION(BUILD_SHARED_LIBS "Build package with shared libraries." ON) ++ + IF(NOT BUILD_SHARED_LIBS) + SET(LINK_SEARCH_START_STATIC TRUE) + ENDIF(NOT BUILD_SHARED_LIBS) +@@ -58,6 +59,12 @@ SET(ASSIMP_PACKAGE_VERSION "0" CACHE STRING "the package-specific version used f + add_definitions( -DOPENDDL_NO_USE_CPP11 ) + set_property( GLOBAL PROPERTY CXX_STANDARD 11 ) + ++OPTION ( BUILD_DOCS ++ "Build documentation using Doxygen." ++ OFF ++) ++add_subdirectory(doc) ++ + # Get the current working branch + EXECUTE_PROCESS( + COMMAND git rev-parse --abbrev-ref HEAD +@@ -105,6 +112,10 @@ IF( CMAKE_COMPILER_IS_MINGW ) + ADD_DEFINITIONS(-DASSIMP_BUILD_NO_IFC_IMPORTER ) + ENDIF() + ++IF( UNIX ) ++ include(GNUInstallDirs) ++ENDIF( UNIX ) ++ + IF((CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) AND NOT CMAKE_COMPILER_IS_MINGW) + IF (BUILD_SHARED_LIBS AND CMAKE_SIZEOF_VOID_P EQUAL 8) # -fPIC is only required for shared libs on 64 bit + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") +diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt +new file mode 100644 +index 0000000..0ad04cf +--- /dev/null ++++ b/doc/CMakeLists.txt +@@ -0,0 +1,51 @@ ++# Only test for Doxygent if BUILD_DOCS are ON ++# We will configure Doxygen output anyway in case ++# of manual generation ++if( BUILD_DOCS ) ++ find_package( Doxygen REQUIRED ) ++endif( BUILD_DOCS ) ++ ++set( HTML_OUTPUT "AssimpDoc_Html" CACHE STRING "Output directory for generated HTML documentation. Defaults to AssimpDoc_Html." ) ++ ++# Enable Microsoft CHM help style only on Windows ++set( MICROSOFT_HELP_WORKSHOP "NO") ++if( MSVC ) ++ set( MICROSOFT_HELP_WORKSHOP "YES" ) ++endif( MSVC ) ++ ++configure_file( ++ ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ++ ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile ++ @ONLY ++) ++ ++add_custom_target( ++ docs ALL ++ DEPENDS docs.done ++) ++ ++add_custom_command( ++ OUTPUT docs.done ++ COMMAND ${DOXYGEN_EXECUTABLE} ++ COMMAND ${CMAKE_COMMAND} -E touch docs.done ++ COMMENT "Generating assimp documentation" ++ VERBATIM ++ ) ++ ++IF( UNIX ) ++ include(GNUInstallDirs) ++ENDIF( UNIX ) ++ ++if( DEFINED CMAKE_INSTALL_DOCDIR ) ++ install( ++ DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${HTML_OUTPUT} ++ DESTINATION ${CMAKE_INSTALL_DOCDIR} ++ ) ++ install(FILES ++ ${CMAKE_CURRENT_SOURCE_DIR}/AssimpDoc_Html/AnimationOverview.png ++ ${CMAKE_CURRENT_SOURCE_DIR}/AssimpDoc_Html/AnimationOverview.svg ++ ${CMAKE_CURRENT_SOURCE_DIR}/AssimpDoc_Html/dragonsplash.png ++ DESTINATION ${CMAKE_INSTALL_DOCDIR}/${HTML_OUTPUT} ++ ) ++endif( DEFINED CMAKE_INSTALL_DOCDIR ) ++ +diff --git a/doc/Doxyfile b/doc/Doxyfile.in +similarity index 98% +rename from doc/Doxyfile +rename to doc/Doxyfile.in +index 64dd5d2..ebb6b72 100644 +--- a/doc/Doxyfile ++++ b/doc/Doxyfile.in +@@ -140,7 +140,8 @@ FULL_PATH_NAMES = NO + # relative paths, which will be relative from the directory where doxygen is + # started. + +-STRIP_FROM_PATH = ++STRIP_FROM_PATH = @PROJECT_SOURCE_DIR@ \ ++ @PROJECT_BINARY_DIR@ + + # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of + # the path mentioned in the documentation of a class, which tells +@@ -339,22 +340,6 @@ INLINE_SIMPLE_STRUCTS = NO + + TYPEDEF_HIDES_STRUCT = YES + +-# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +-# determine which symbols to keep in memory and which to flush to disk. +-# When the cache is full, less often used symbols will be written to disk. +-# For small to medium size projects (<1000 input files) the default value is +-# probably good enough. For larger projects a too small cache size can cause +-# doxygen to be busy swapping symbols to and from disk most of the time +-# causing a significant performance penalty. +-# If the system has enough physical memory increasing the cache will improve the +-# performance by keeping more symbols in memory. Note that the value works on +-# a logarithmic scale so increasing the size by one will roughly double the +-# memory usage. The cache size is given by this formula: +-# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +-# corresponding to a cache size of 2^16 = 65536 symbols. +- +-SYMBOL_CACHE_SIZE = 0 +- + # Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be + # set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given + # their name and scope. Since this can be an expensive process and often the +@@ -677,9 +662,12 @@ WARN_LOGFILE = + # directories like "/usr/src/myproject". Separate the files or directories + # with spaces. + +-INPUT = ../include/ \ +- ../doc/dox.h \ +- ../code/BaseImporter.h ++INPUT = @doxy_main_page@ \ ++ @PROJECT_SOURCE_DIR@ \ ++ @PROJECT_BINARY_DIR@ \ ++ @PROJECT_SOURCE_DIR@/include/ \ ++ @PROJECT_SOURCE_DIR@/doc/dox.h \ ++ @PROJECT_SOURCE_DIR@/code/BaseImporter.h + + # This tag can be used to specify the character encoding of the source files + # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +@@ -919,7 +907,7 @@ GENERATE_HTML = YES + # If a relative path is entered the value of OUTPUT_DIRECTORY will be + # put in front of it. If left blank `html' will be used as the default path. + +-HTML_OUTPUT = AssimpDoc_Html ++HTML_OUTPUT = @HTML_OUTPUT@ + + # The HTML_FILE_EXTENSION tag can be used to specify the file extension for + # each generated HTML page (for example: .htm,.php,.asp). If it is left blank +@@ -953,7 +941,7 @@ HTML_FOOTER = + # HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this + # tag will in the future become obsolete. + +-HTML_STYLESHEET = style.css ++# HTML_STYLESHEET = @CMAKE_CURRENT_SOURCE_DIR@/style.css + + # The HTML_EXTRA_STYLESHEET tag can be used to specify an additional + # user-defined cascading style sheet that is included after the standard +@@ -1064,7 +1052,7 @@ DOCSET_PUBLISHER_NAME = Publisher + # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) + # of the generated HTML documentation. + +-GENERATE_HTMLHELP = YES ++GENERATE_HTMLHELP = @MICROSOFT_HELP_WORKSHOP@ + + # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can + # be used to specify the file name of the resulting .chm file. You +@@ -1504,18 +1492,6 @@ GENERATE_XML = NO + + XML_OUTPUT = xml + +-# The XML_SCHEMA tag can be used to specify an XML schema, +-# which can be used by a validating XML parser to check the +-# syntax of the XML files. +- +-XML_SCHEMA = +- +-# The XML_DTD tag can be used to specify an XML DTD, +-# which can be used by a validating XML parser to check the +-# syntax of the XML files. +- +-XML_DTD = +- + # If the XML_PROGRAMLISTING tag is set to YES Doxygen will + # dump the program listings (including syntax highlighting + # and cross-referencing information) to the XML output. Note that +-- +2.9.3 + diff --git a/0001-Morph-animation-support-for-collada.patch b/0001-Morph-animation-support-for-collada.patch new file mode 100644 index 0000000..c955d5c --- /dev/null +++ b/0001-Morph-animation-support-for-collada.patch @@ -0,0 +1,966 @@ +From 42e353f2a672baed485c03acf30529c77092ece9 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Antti=20M=C3=A4=C3=A4tt=C3=A4?= +Date: Thu, 12 Jan 2017 13:41:32 +0200 +Subject: [PATCH] Morph animation support for collada + +--- + code/CMakeLists.txt | 2 + + code/ColladaHelper.h | 31 +++++ + code/ColladaLoader.cpp | 310 ++++++++++++++++++++++++++++++++++++++++++------ + code/ColladaLoader.h | 5 + + code/ColladaParser.cpp | 48 +++++++- + code/CreateAnimMesh.cpp | 92 ++++++++++++++ + code/CreateAnimMesh.h | 56 +++++++++ + include/assimp/anim.h | 95 +++++++++++++-- + include/assimp/mesh.h | 36 +++++- + 9 files changed, 623 insertions(+), 52 deletions(-) + create mode 100644 code/CreateAnimMesh.cpp + create mode 100644 code/CreateAnimMesh.h + +diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt +index 35ecf50..e0747d6 100644 +--- a/code/CMakeLists.txt ++++ b/code/CMakeLists.txt +@@ -171,6 +171,8 @@ SET( Common_SRCS + Bitmap.h + XMLTools.h + Version.cpp ++ CreateAnimMesh.h ++ CreateAnimMesh.cpp + ) + SOURCE_GROUP(Common FILES ${Common_SRCS}) + +diff --git a/code/ColladaHelper.h b/code/ColladaHelper.h +index 5a51642..5ff4904 100644 +--- a/code/ColladaHelper.h ++++ b/code/ColladaHelper.h +@@ -89,6 +89,21 @@ enum InputType + IT_Bitangent + }; + ++/** Supported controller types */ ++enum ControllerType ++{ ++ Skin, ++ Morph ++}; ++ ++/** Supported morph methods */ ++enum MorphMethod ++{ ++ Normalized, ++ Relative ++}; ++ ++ + /** Contains all data for one of the different transformation types */ + struct Transform + { +@@ -380,6 +395,12 @@ enum PrimitiveType + /** A skeleton controller to deform a mesh with the use of joints */ + struct Controller + { ++ // controller type ++ ControllerType mType; ++ ++ // Morphing method if type is Morph ++ MorphMethod mMethod; ++ + // the URL of the mesh deformed by the controller. + std::string mMeshId; + +@@ -402,6 +423,9 @@ struct Controller + + // JointIndex-WeightIndex pairs for all vertices + std::vector< std::pair > mWeights; ++ ++ std::string mMorphTarget; ++ std::string mMorphWeight; + }; + + /** A collada material. Pretty much the only member is a reference to an effect. */ +@@ -577,6 +601,12 @@ struct AnimationChannel + std::string mSourceTimes; + /** Source URL of the value values. Collada calls them "output". */ + std::string mSourceValues; ++ /** Source URL of the IN_TANGENT semantic values. */ ++ std::string mInTanValues; ++ /** Source URL of the OUT_TANGENT semantic values. */ ++ std::string mOutTanValues; ++ /** Source URL of the INTERPOLATION semantic values. */ ++ std::string mInterpolationValues; + }; + + /** An animation. Container for 0-x animation channels or 0-x animations */ +@@ -645,6 +675,7 @@ struct Animation + struct ChannelEntry + { + const Collada::AnimationChannel* mChannel; ///> the source channel ++ std::string mTargetId; + std::string mTransformId; // the ID of the transformation step of the node which is influenced + size_t mTransformIndex; // Index into the node's transform chain to apply the channel to + size_t mSubElement; // starting index inside the transform data +diff --git a/code/ColladaLoader.cpp b/code/ColladaLoader.cpp +index 6cc0f85..a3b6d6e 100644 +--- a/code/ColladaLoader.cpp ++++ b/code/ColladaLoader.cpp +@@ -55,6 +55,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "ParsingUtils.h" + #include "SkeletonMeshBuilder.h" + #include "Defines.h" ++#include "CreateAnimMesh.h" + + #include "time.h" + #include "math.h" +@@ -148,6 +149,7 @@ void ColladaLoader::InternReadFile( const std::string& pFile, aiScene* pScene, I + mMeshIndexByID.clear(); + mMaterialIndexByName.clear(); + mMeshes.clear(); ++ mTargetMeshes.clear(); + newMats.clear(); + mLights.clear(); + mCameras.clear(); +@@ -562,6 +564,21 @@ void ColladaLoader::BuildMeshesForNode( const ColladaParser& pParser, const Coll + } + + // ------------------------------------------------------------------------------------------------ ++// Find mesh from either meshes or morph target meshes ++aiMesh *ColladaLoader::findMesh(std::string meshid) ++{ ++ for (unsigned int i = 0; i < mMeshes.size(); i++) ++ if (std::string(mMeshes[i]->mName.data) == meshid) ++ return mMeshes[i]; ++ ++ for (unsigned int i = 0; i < mTargetMeshes.size(); i++) ++ if (std::string(mTargetMeshes[i]->mName.data) == meshid) ++ return mTargetMeshes[i]; ++ ++ return NULL; ++} ++ ++// ------------------------------------------------------------------------------------------------ + // Creates a mesh for the given ColladaMesh face subset and returns the newly created mesh + aiMesh* ColladaLoader::CreateMesh( const ColladaParser& pParser, const Collada::Mesh* pSrcMesh, const Collada::SubMesh& pSubMesh, + const Collada::Controller* pSrcController, size_t pStartVertex, size_t pStartFace) +@@ -646,8 +663,70 @@ aiMesh* ColladaLoader::CreateMesh( const ColladaParser& pParser, const Collada:: + face.mIndices[b] = vertex++; + } + ++ // create morph target meshes if any ++ std::vector targetMeshes; ++ std::vector targetWeights; ++ Collada::MorphMethod method; ++ ++ for(std::map::const_iterator it = pParser.mControllerLibrary.begin(); ++ it != pParser.mControllerLibrary.end(); it++) ++ { ++ const Collada::Controller &c = it->second; ++ const Collada::Mesh* baseMesh = pParser.ResolveLibraryReference( pParser.mMeshLibrary, c.mMeshId); ++ ++ if (c.mType == Collada::Morph && baseMesh->mName == pSrcMesh->mName) ++ { ++ const Collada::Accessor& targetAccessor = pParser.ResolveLibraryReference( pParser.mAccessorLibrary, c.mMorphTarget); ++ const Collada::Accessor& weightAccessor = pParser.ResolveLibraryReference( pParser.mAccessorLibrary, c.mMorphWeight); ++ const Collada::Data& targetData = pParser.ResolveLibraryReference( pParser.mDataLibrary, targetAccessor.mSource); ++ const Collada::Data& weightData = pParser.ResolveLibraryReference( pParser.mDataLibrary, weightAccessor.mSource); ++ ++ // take method ++ method = c.mMethod; ++ ++ if (!targetData.mIsStringArray) ++ throw DeadlyImportError( "target data must contain id. "); ++ if (weightData.mIsStringArray) ++ throw DeadlyImportError( "target weight data must not be textual "); ++ ++ for (unsigned int i = 0; i < targetData.mStrings.size(); ++i) ++ { ++ const Collada::Mesh* targetMesh = pParser.ResolveLibraryReference(pParser.mMeshLibrary, targetData.mStrings.at(i)); ++ ++ aiMesh *aimesh = findMesh(targetMesh->mName); ++ if (!aimesh) ++ { ++ if (targetMesh->mSubMeshes.size() > 1) ++ throw DeadlyImportError( "Morhing target mesh must be a single"); ++ aimesh = CreateMesh(pParser, targetMesh, targetMesh->mSubMeshes.at(0), NULL, 0, 0); ++ mTargetMeshes.push_back(aimesh); ++ } ++ targetMeshes.push_back(aimesh); ++ } ++ for (unsigned int i = 0; i < weightData.mValues.size(); ++i) ++ targetWeights.push_back(weightData.mValues.at(i)); ++ } ++ } ++ if (targetMeshes.size() > 0 && targetWeights.size() == targetMeshes.size()) ++ { ++ std::vector animMeshes; ++ for (unsigned int i = 0; i < targetMeshes.size(); i++) ++ { ++ aiAnimMesh *animMesh = aiCreateAnimMesh(targetMeshes.at(i)); ++ animMesh->mWeight = targetWeights[i]; ++ animMeshes.push_back(animMesh); ++ } ++ dstMesh->mMethod = (method == Collada::Relative) ++ ? aiMorphingMethod_MORPH_RELATIVE ++ : aiMorphingMethod_MORPH_NORMALIZED; ++ dstMesh->mAnimMeshes = new aiAnimMesh*[animMeshes.size()]; ++ dstMesh->mNumAnimMeshes = animMeshes.size(); ++ for (unsigned int i = 0; i < animMeshes.size(); i++) ++ dstMesh->mAnimMeshes[i] = animMeshes.at(i); ++ } ++ + // create bones if given +- if( pSrcController) ++ if( pSrcController && pSrcController->mType == Collada::Skin) + { + // refuse if the vertex count does not match + // if( pSrcController->mWeightCounts.size() != dstMesh->mNumVertices) +@@ -946,6 +1025,68 @@ void ColladaLoader::StoreAnimations( aiScene* pScene, const ColladaParser& pPars + CreateAnimation( pScene, pParser, pSrcAnim, animName); + } + ++struct MorphTimeValues ++{ ++ float mTime; ++ struct key ++ { ++ float mWeight; ++ unsigned int mValue; ++ }; ++ std::vector mKeys; ++}; ++ ++void insertMorphTimeValue(std::vector &values, float time, float weight, unsigned int value) ++{ ++ MorphTimeValues::key k; ++ k.mValue = value; ++ k.mWeight = weight; ++ if (values.size() == 0 || time < values[0].mTime) ++ { ++ MorphTimeValues val; ++ val.mTime = time; ++ val.mKeys.push_back(k); ++ values.insert(values.begin(), val); ++ return; ++ } ++ if (time > values.back().mTime) ++ { ++ MorphTimeValues val; ++ val.mTime = time; ++ val.mKeys.push_back(k); ++ values.insert(values.end(), val); ++ return; ++ } ++ for (unsigned int i = 0; i < values.size(); i++) ++ { ++ if (std::abs(time - values[i].mTime) < 1e-6f) ++ { ++ values[i].mKeys.push_back(k); ++ return; ++ } else if (time > values[i].mTime && time < values[i+1].mTime) ++ { ++ MorphTimeValues val; ++ val.mTime = time; ++ val.mKeys.push_back(k); ++ values.insert(values.begin() + i, val); ++ return; ++ } ++ } ++ // should not get here ++} ++ ++float getWeightAtKey(const std::vector &values, int key, unsigned int value) ++{ ++ for (unsigned int i = 0; i < values[key].mKeys.size(); i++) ++ { ++ if (values[key].mKeys[i].mValue == value) ++ return values[key].mKeys[i].mWeight; ++ } ++ // no value at key found, try to interpolate if present at other keys. if not, return zero ++ // TODO: interpolation ++ return 0.0f; ++} ++ + // ------------------------------------------------------------------------------------------------ + // Constructs the animation for the given source anim + void ColladaLoader::CreateAnimation( aiScene* pScene, const ColladaParser& pParser, const Collada::Animation* pSrcAnim, const std::string& pName) +@@ -955,6 +1096,8 @@ void ColladaLoader::CreateAnimation( aiScene* pScene, const ColladaParser& pPars + CollectNodes( pScene->mRootNode, nodes); + + std::vector anims; ++ std::vector morphAnims; ++ + for( std::vector::const_iterator nit = nodes.begin(); nit != nodes.end(); ++nit) + { + // find all the collada anim channels which refer to the current node +@@ -978,7 +1121,20 @@ void ColladaLoader::CreateAnimation( aiScene* pScene, const ColladaParser& pPars + // find the slash that separates the node name - there should be only one + std::string::size_type slashPos = srcChannel.mTarget.find( '/'); + if( slashPos == std::string::npos) ++ { ++ std::string::size_type targetPos = srcChannel.mTarget.find(srcNode->mID); ++ if (targetPos == std::string::npos) ++ continue; ++ ++ // not node transform, but something else. store as unknown animation channel for now ++ entry.mChannel = &(*cit); ++ entry.mTargetId = srcChannel.mTarget.substr(targetPos + pSrcAnim->mName.length(), ++ srcChannel.mTarget.length() - targetPos - pSrcAnim->mName.length()); ++ if (entry.mTargetId.front() == '-') ++ entry.mTargetId = entry.mTargetId.substr(1); ++ entries.push_back(entry); + continue; ++ } + if( srcChannel.mTarget.find( '/', slashPos+1) != std::string::npos) + continue; + std::string targetID = srcChannel.mTarget.substr( 0, slashPos); +@@ -1058,8 +1214,14 @@ void ColladaLoader::CreateAnimation( aiScene* pScene, const ColladaParser& pPars + if( srcNode->mTransforms[a].mID == entry.mTransformId) + entry.mTransformIndex = a; + +- if( entry.mTransformIndex == SIZE_MAX) { +- continue; ++ if( entry.mTransformIndex == SIZE_MAX) ++ { ++ if (entry.mTransformId.find("morph-weights") != std::string::npos) ++ { ++ entry.mTargetId = entry.mTransformId; ++ entry.mTransformId = ""; ++ } else ++ continue; + } + + entry.mChannel = &(*cit); +@@ -1203,49 +1365,125 @@ void ColladaLoader::CreateAnimation( aiScene* pScene, const ColladaParser& pPars + // ai_assert( resultTrafos.size() > 0); + + // build an animation channel for the given node out of these trafo keys +- if( !resultTrafos.empty() ) +- { +- aiNodeAnim* dstAnim = new aiNodeAnim; +- dstAnim->mNodeName = nodeName; +- dstAnim->mNumPositionKeys = resultTrafos.size(); +- dstAnim->mNumRotationKeys= resultTrafos.size(); +- dstAnim->mNumScalingKeys = resultTrafos.size(); +- dstAnim->mPositionKeys = new aiVectorKey[resultTrafos.size()]; +- dstAnim->mRotationKeys = new aiQuatKey[resultTrafos.size()]; +- dstAnim->mScalingKeys = new aiVectorKey[resultTrafos.size()]; +- +- for( size_t a = 0; a < resultTrafos.size(); ++a) +- { +- aiMatrix4x4 mat = resultTrafos[a]; +- double time = double( mat.d4); // remember? time is stored in mat.d4 +- mat.d4 = 1.0f; +- +- dstAnim->mPositionKeys[a].mTime = time; +- dstAnim->mRotationKeys[a].mTime = time; +- dstAnim->mScalingKeys[a].mTime = time; +- mat.Decompose( dstAnim->mScalingKeys[a].mValue, dstAnim->mRotationKeys[a].mValue, dstAnim->mPositionKeys[a].mValue); +- } ++ if( !resultTrafos.empty() ) ++ { ++ aiNodeAnim* dstAnim = new aiNodeAnim; ++ dstAnim->mNodeName = nodeName; ++ dstAnim->mNumPositionKeys = resultTrafos.size(); ++ dstAnim->mNumRotationKeys= resultTrafos.size(); ++ dstAnim->mNumScalingKeys = resultTrafos.size(); ++ dstAnim->mPositionKeys = new aiVectorKey[resultTrafos.size()]; ++ dstAnim->mRotationKeys = new aiQuatKey[resultTrafos.size()]; ++ dstAnim->mScalingKeys = new aiVectorKey[resultTrafos.size()]; ++ ++ for( size_t a = 0; a < resultTrafos.size(); ++a) ++ { ++ aiMatrix4x4 mat = resultTrafos[a]; ++ double time = double( mat.d4); // remember? time is stored in mat.d4 ++ mat.d4 = 1.0f; ++ ++ dstAnim->mPositionKeys[a].mTime = time; ++ dstAnim->mRotationKeys[a].mTime = time; ++ dstAnim->mScalingKeys[a].mTime = time; ++ mat.Decompose( dstAnim->mScalingKeys[a].mValue, dstAnim->mRotationKeys[a].mValue, dstAnim->mPositionKeys[a].mValue); ++ } + +- anims.push_back( dstAnim); +- } else +- { +- DefaultLogger::get()->warn( "Collada loader: found empty animation channel, ignored. Please check your exporter."); +- } ++ anims.push_back( dstAnim); ++ } else ++ { ++ DefaultLogger::get()->warn( "Collada loader: found empty animation channel, ignored. Please check your exporter."); ++ } ++ ++ if( !entries.empty() && entries.front().mTimeAccessor->mCount > 0 ) ++ { ++ std::vector morphChannels; ++ for( std::vector::iterator it = entries.begin(); it != entries.end(); ++it) ++ { ++ Collada::ChannelEntry& e = *it; ++ ++ // skip non-transform types ++ if (e.mTargetId.empty()) ++ continue; ++ ++ if (e.mTargetId.find("morph-weights") != std::string::npos) ++ morphChannels.push_back(e); ++ } ++ if (morphChannels.size() > 0) ++ { ++ // either 1) morph weight animation count should contain morph target count channels ++ // or 2) one channel with morph target count arrays ++ // assume first ++ ++ aiMeshMorphAnim *morphAnim = new aiMeshMorphAnim; ++ morphAnim->mName.Set(nodeName); ++ ++ std::vector morphTimeValues; ++ ++ int morphAnimChannelIndex = 0; ++ for( std::vector::iterator it = morphChannels.begin(); it != morphChannels.end(); ++it) ++ { ++ Collada::ChannelEntry& e = *it; ++ std::string::size_type apos = e.mTargetId.find('('); ++ std::string::size_type bpos = e.mTargetId.find(')'); ++ if (apos == std::string::npos || bpos == std::string::npos) ++ // unknown way to specify weight -> ignore this animation ++ continue; ++ ++ // weight target can be in format Weight_M_N, Weight_N, WeightN, or some other way ++ // we ignore the name and just assume the channels are in the right order ++ for (unsigned int i = 0; i < e.mTimeData->mValues.size(); i++) ++ insertMorphTimeValue(morphTimeValues, e.mTimeData->mValues.at(i), e.mValueData->mValues.at(i), morphAnimChannelIndex); ++ ++ ++morphAnimChannelIndex; ++ } ++ ++ morphAnim->mNumKeys = morphTimeValues.size(); ++ morphAnim->mKeys = new aiMeshMorphKey[morphAnim->mNumKeys]; ++ for (unsigned int key = 0; key < morphAnim->mNumKeys; key++) ++ { ++ morphAnim->mKeys[key].mNumValuesAndWeights = morphChannels.size(); ++ morphAnim->mKeys[key].mValues = new unsigned int [morphChannels.size()]; ++ morphAnim->mKeys[key].mWeights = new double [morphChannels.size()]; ++ ++ morphAnim->mKeys[key].mTime = morphTimeValues[key].mTime; ++ for (unsigned int valueIndex = 0; valueIndex < morphChannels.size(); valueIndex++) ++ { ++ morphAnim->mKeys[key].mValues[valueIndex] = valueIndex; ++ morphAnim->mKeys[key].mWeights[valueIndex] = getWeightAtKey(morphTimeValues, key, valueIndex); ++ } ++ } ++ ++ morphAnims.push_back(morphAnim); ++ } ++ } + } + +- if( !anims.empty()) ++ if( !anims.empty() || !morphAnims.empty()) + { + aiAnimation* anim = new aiAnimation; + anim->mName.Set( pName); + anim->mNumChannels = anims.size(); +- anim->mChannels = new aiNodeAnim*[anims.size()]; +- std::copy( anims.begin(), anims.end(), anim->mChannels); ++ if (anim->mNumChannels > 0) ++ { ++ anim->mChannels = new aiNodeAnim*[anims.size()]; ++ std::copy( anims.begin(), anims.end(), anim->mChannels); ++ } ++ anim->mNumMorphMeshChannels = morphAnims.size(); ++ if (anim->mNumMorphMeshChannels > 0) ++ { ++ anim->mMorphMeshChannels = new aiMeshMorphAnim*[anim->mNumMorphMeshChannels]; ++ std::copy( morphAnims.begin(), morphAnims.end(), anim->mMorphMeshChannels); ++ } + anim->mDuration = 0.0f; + for( size_t a = 0; a < anims.size(); ++a) + { +- anim->mDuration = std::max( anim->mDuration, anims[a]->mPositionKeys[anims[a]->mNumPositionKeys-1].mTime); +- anim->mDuration = std::max( anim->mDuration, anims[a]->mRotationKeys[anims[a]->mNumRotationKeys-1].mTime); +- anim->mDuration = std::max( anim->mDuration, anims[a]->mScalingKeys[anims[a]->mNumScalingKeys-1].mTime); ++ anim->mDuration = std::max( anim->mDuration, anims[a]->mPositionKeys[anims[a]->mNumPositionKeys-1].mTime); ++ anim->mDuration = std::max( anim->mDuration, anims[a]->mRotationKeys[anims[a]->mNumRotationKeys-1].mTime); ++ anim->mDuration = std::max( anim->mDuration, anims[a]->mScalingKeys[anims[a]->mNumScalingKeys-1].mTime); ++ } ++ for (size_t a = 0; a < morphAnims.size(); ++a) ++ { ++ anim->mDuration = std::max(anim->mDuration, morphAnims[a]->mKeys[morphAnims[a]->mNumKeys-1].mTime); + } + anim->mTicksPerSecond = 1; + mAnims.push_back( anim); +diff --git a/code/ColladaLoader.h b/code/ColladaLoader.h +index 313608c..fc26532 100644 +--- a/code/ColladaLoader.h ++++ b/code/ColladaLoader.h +@@ -117,6 +117,8 @@ protected: + /** Builds meshes for the given node and references them */ + void BuildMeshesForNode( const ColladaParser& pParser, const Collada::Node* pNode, + aiNode* pTarget); ++ ++ aiMesh *findMesh(std::string meshid); + + /** Creates a mesh for the given ColladaMesh face subset and returns the newly created mesh */ + aiMesh* CreateMesh( const ColladaParser& pParser, const Collada::Mesh* pSrcMesh, const Collada::SubMesh& pSubMesh, +@@ -223,6 +225,9 @@ protected: + + /** Accumulated meshes for the target scene */ + std::vector mMeshes; ++ ++ /** Accumulated morph target meshes */ ++ std::vector mTargetMeshes; + + /** Temporary material list */ + std::vector > newMats; +diff --git a/code/ColladaParser.cpp b/code/ColladaParser.cpp +index 527e2ed..ce87476 100644 +--- a/code/ColladaParser.cpp ++++ b/code/ColladaParser.cpp +@@ -586,6 +586,12 @@ void ColladaParser::ReadAnimationSampler( Collada::AnimationChannel& pChannel) + pChannel.mSourceTimes = source; + else if( strcmp( semantic, "OUTPUT") == 0) + pChannel.mSourceValues = source; ++ else if( strcmp( semantic, "IN_TANGENT") == 0) ++ pChannel.mInTanValues = source; ++ else if( strcmp( semantic, "OUT_TANGENT") == 0) ++ pChannel.mOutTanValues = source; ++ else if( strcmp( semantic, "INTERPOLATION") == 0) ++ pChannel.mInterpolationValues = source; + + if( !mReader->isEmptyElement()) + SkipElement(); +@@ -648,6 +654,9 @@ void ColladaParser::ReadControllerLibrary() + // Reads a controller into the given mesh structure + void ColladaParser::ReadController( Collada::Controller& pController) + { ++ // initial values ++ pController.mType = Skin; ++ pController.mMethod = Normalized; + while( mReader->read()) + { + if( mReader->getNodeType() == irr::io::EXN_ELEMENT) +@@ -655,8 +664,15 @@ void ColladaParser::ReadController( Collada::Controller& pController) + // two types of controllers: "skin" and "morph". Only the first one is relevant, we skip the other + if( IsElement( "morph")) + { +- // should skip everything inside, so there's no danger of catching elements inbetween +- SkipElement(); ++ pController.mType = Morph; ++ int baseIndex = GetAttribute("source"); ++ pController.mMeshId = mReader->getAttributeValue(baseIndex) + 1; ++ int methodIndex = GetAttribute("method"); ++ if (methodIndex > 0) { ++ const char *method = mReader->getAttributeValue(methodIndex); ++ if (strcmp(method, "RELATIVE") == 0) ++ pController.mMethod = Relative; ++ } + } + else if( IsElement( "skin")) + { +@@ -694,6 +710,32 @@ void ColladaParser::ReadController( Collada::Controller& pController) + { + ReadControllerWeights( pController); + } ++ else if ( IsElement( "targets" )) ++ { ++ while (mReader->read()) { ++ if( mReader->getNodeType() == irr::io::EXN_ELEMENT) { ++ if ( IsElement( "input")) { ++ int semanticsIndex = GetAttribute("semantic"); ++ int sourceIndex = GetAttribute("source"); ++ ++ const char *semantics = mReader->getAttributeValue(semanticsIndex); ++ const char *source = mReader->getAttributeValue(sourceIndex); ++ if (strcmp(semantics, "MORPH_TARGET") == 0) { ++ pController.mMorphTarget = source + 1; ++ } ++ else if (strcmp(semantics, "MORPH_WEIGHT") == 0) ++ { ++ pController.mMorphWeight = source + 1; ++ } ++ } ++ } else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { ++ if( strcmp( mReader->getNodeName(), "targets") == 0) ++ break; ++ else ++ ThrowException( "Expected end of element."); ++ } ++ } ++ } + else + { + // ignore the rest +@@ -704,7 +746,7 @@ void ColladaParser::ReadController( Collada::Controller& pController) + { + if( strcmp( mReader->getNodeName(), "controller") == 0) + break; +- else if( strcmp( mReader->getNodeName(), "skin") != 0) ++ else if( strcmp( mReader->getNodeName(), "skin") != 0 && strcmp( mReader->getNodeName(), "morph") != 0) + ThrowException( "Expected end of element."); + } + } +diff --git a/code/CreateAnimMesh.cpp b/code/CreateAnimMesh.cpp +new file mode 100644 +index 0000000..094a414 +--- /dev/null ++++ b/code/CreateAnimMesh.cpp +@@ -0,0 +1,92 @@ ++/* ++--------------------------------------------------------------------------- ++Open Asset Import Library (assimp) ++--------------------------------------------------------------------------- ++ ++Copyright (C) 2016 The Qt Company Ltd. ++Copyright (c) 2006-2012, 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 "CreateAnimMesh.h" ++ ++namespace Assimp { ++ ++aiAnimMesh *aiCreateAnimMesh(const aiMesh *mesh) ++{ ++ aiAnimMesh *animesh = new aiAnimMesh; ++ animesh->mVertices = NULL; ++ animesh->mNormals = NULL; ++ animesh->mTangents = NULL; ++ animesh->mBitangents = NULL; ++ animesh->mNumVertices = mesh->mNumVertices; ++ if (mesh->mVertices) { ++ animesh->mVertices = new aiVector3D[animesh->mNumVertices]; ++ std::memcpy(animesh->mVertices, mesh->mVertices, mesh->mNumVertices * sizeof(aiVector3D)); ++ } ++ if (mesh->mNormals) { ++ animesh->mNormals = new aiVector3D[animesh->mNumVertices]; ++ std::memcpy(animesh->mNormals, mesh->mNormals, mesh->mNumVertices * sizeof(aiVector3D)); ++ } ++ if (mesh->mTangents) { ++ animesh->mTangents = new aiVector3D[animesh->mNumVertices]; ++ std::memcpy(animesh->mTangents, mesh->mTangents, mesh->mNumVertices * sizeof(aiVector3D)); ++ } ++ if (mesh->mBitangents) { ++ animesh->mBitangents = new aiVector3D[animesh->mNumVertices]; ++ std::memcpy(animesh->mBitangents, mesh->mBitangents, mesh->mNumVertices * sizeof(aiVector3D)); ++ } ++ ++ for (int i = 0; i < AI_MAX_NUMBER_OF_COLOR_SETS; ++i) { ++ if (mesh->mColors[i]) { ++ animesh->mColors[i] = new aiColor4D[animesh->mNumVertices]; ++ std::memcpy(animesh->mColors[i], mesh->mColors[i], mesh->mNumVertices * sizeof(aiColor4D)); ++ } else { ++ animesh->mColors[i] = NULL; ++ } ++ } ++ ++ for (int i = 0; i < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++i) { ++ if (mesh->mTextureCoords[i]) { ++ animesh->mTextureCoords[i] = new aiVector3D[animesh->mNumVertices]; ++ std::memcpy(animesh->mTextureCoords[i], mesh->mTextureCoords[i], mesh->mNumVertices * sizeof(aiVector3D)); ++ } else { ++ animesh->mTextureCoords[i] = NULL; ++ } ++ } ++ return animesh; ++} ++ ++} // end of namespace Assimp +diff --git a/code/CreateAnimMesh.h b/code/CreateAnimMesh.h +new file mode 100644 +index 0000000..c5ceb40 +--- /dev/null ++++ b/code/CreateAnimMesh.h +@@ -0,0 +1,56 @@ ++/* ++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. ++ ++---------------------------------------------------------------------- ++*/ ++ ++/** @file CreateAnimMesh.h ++ * Create AnimMesh from Mesh ++ */ ++#ifndef INCLUDED_AI_CREATE_ANIM_MESH_H ++#define INCLUDED_AI_CREATE_ANIM_MESH_H ++ ++#include ++ ++namespace Assimp { ++ ++/** Create aiAnimMesh from aiMesh. */ ++aiAnimMesh *aiCreateAnimMesh(const aiMesh *mesh); ++ ++} // end of namespace Assimp ++#endif // INCLUDED_AI_CREATE_ANIM_MESH_H ++ +diff --git a/include/assimp/anim.h b/include/assimp/anim.h +index af59417..7b4dff8 100644 +--- a/include/assimp/anim.h ++++ b/include/assimp/anim.h +@@ -182,6 +182,39 @@ struct aiMeshKey + }; + + // --------------------------------------------------------------------------- ++/** Binds a morph anim mesh to a specific point in time. */ ++struct aiMeshMorphKey ++{ ++ /** The time of this key */ ++ double mTime; ++ ++ /** The values and weights at the time of this key */ ++ unsigned int *mValues; ++ double *mWeights; ++ ++ /** The number of values and weights */ ++ unsigned int mNumValuesAndWeights; ++#ifdef __cplusplus ++ aiMeshMorphKey() ++ : mTime(0.0) ++ , mValues(NULL) ++ , mWeights(NULL) ++ , mNumValuesAndWeights(0) ++ { ++ ++ } ++ ++ ~aiMeshMorphKey() ++ { ++ if (mNumValuesAndWeights && mValues && mWeights) { ++ delete [] mValues; ++ delete [] mWeights; ++ } ++ } ++#endif ++}; ++ ++// --------------------------------------------------------------------------- + /** Defines how an animation channel behaves outside the defined time + * range. This corresponds to aiNodeAnim::mPreState and + * aiNodeAnim::mPostState.*/ +@@ -335,7 +368,38 @@ struct aiMeshAnim + }; + + // --------------------------------------------------------------------------- +-/** An animation consists of keyframe data for a number of nodes. For ++/** Describes a morphing animation of a given mesh. */ ++struct aiMeshMorphAnim ++{ ++ /** Name of the mesh to be animated. An empty string is not allowed, ++ * animated meshes need to be named (not necessarily uniquely, ++ * the name can basically serve as wildcard to select a group ++ * of meshes with similar animation setup)*/ ++ C_STRUCT aiString mName; ++ ++ /** Size of the #mKeys array. Must be 1, at least. */ ++ unsigned int mNumKeys; ++ ++ /** Key frames of the animation. May not be NULL. */ ++ C_STRUCT aiMeshMorphKey* mKeys; ++ ++#ifdef __cplusplus ++ ++ aiMeshMorphAnim() ++ : mNumKeys() ++ , mKeys() ++ {} ++ ++ ~aiMeshMorphAnim() ++ { ++ delete[] mKeys; ++ } ++ ++#endif ++}; ++ ++// --------------------------------------------------------------------------- ++/** An animation consists of key-frame data for a number of nodes. For + * each node affected by the animation a separate series of data is given.*/ + struct aiAnimation + { +@@ -367,15 +431,25 @@ struct aiAnimation + * The array is mNumMeshChannels in size. */ + C_STRUCT aiMeshAnim** mMeshChannels; + ++ /** The number of mesh animation channels. Each channel affects ++ * a single mesh and defines morphing animation. */ ++ unsigned int mNumMorphMeshChannels; ++ ++ /** The morph mesh animation channels. Each channel affects a single mesh. ++ * The array is mNumMorphMeshChannels in size. */ ++ C_STRUCT aiMeshMorphAnim **mMorphMeshChannels; ++ + #ifdef __cplusplus + aiAnimation() +- : mDuration(-1.) +- , mTicksPerSecond() +- , mNumChannels() +- , mChannels() +- , mNumMeshChannels() +- , mMeshChannels() +- { ++ : mDuration(-1.) ++ , mTicksPerSecond(0.) ++ , mNumChannels(0) ++ , mChannels(NULL) ++ , mNumMeshChannels(0) ++ , mMeshChannels(NULL) ++ , mNumMorphMeshChannels(0) ++ , mMorphMeshChannels(NULL) { ++ // empty + } + + ~aiAnimation() +@@ -395,6 +469,11 @@ struct aiAnimation + + delete [] mMeshChannels; + } ++ if (mNumMorphMeshChannels && mMorphMeshChannels) { ++ for( unsigned int a = 0; a < mNumMorphMeshChannels; a++) { ++ delete mMorphMeshChannels[a]; ++ } ++ } + } + #endif // __cplusplus + }; +diff --git a/include/assimp/mesh.h b/include/assimp/mesh.h +index a76a2d7..2ebc14d 100644 +--- a/include/assimp/mesh.h ++++ b/include/assimp/mesh.h +@@ -377,6 +377,9 @@ struct aiAnimMesh + */ + unsigned int mNumVertices; + ++/** Weight of the AnimMesh. */ ++ float mWeight; ++ + #ifdef __cplusplus + + aiAnimMesh() +@@ -445,6 +448,27 @@ struct aiAnimMesh + #endif + }; + ++// --------------------------------------------------------------------------- ++/** @brief Enumerates the methods of mesh morphing supported by Assimp. ++ */ ++enum aiMorphingMethod ++{ ++ /** Interpolation between morph targets */ ++ aiMorphingMethod_VERTEX_BLEND = 0x1, ++ ++ /** Normalized morphing between morph targets */ ++ aiMorphingMethod_MORPH_NORMALIZED = 0x2, ++ ++ /** Relative morphing between morph targets */ ++ aiMorphingMethod_MORPH_RELATIVE = 0x3, ++ ++ /** This value is not used. It is just here to force the ++ * compiler to map this enum to a 32 Bit integer. ++ */ ++#ifndef SWIG ++ _aiMorphingMethod_Force32Bit = INT_MAX ++#endif ++}; //! enum aiMorphingMethod + + // --------------------------------------------------------------------------- + /** @brief A mesh represents a geometry or model with a single material. +@@ -599,15 +623,18 @@ struct aiMesh + C_STRUCT aiString mName; + + +- /** NOT CURRENTLY IN USE. The number of attachment meshes */ ++ /** The number of attachment meshes. Note! Currently only works with Collada loader. */ + unsigned int mNumAnimMeshes; + +- /** NOT CURRENTLY IN USE. Attachment meshes for this mesh, for vertex-based animation. ++ /** Attachment meshes for this mesh, for vertex-based animation. + * Attachment meshes carry replacement data for some of the +- * mesh'es vertex components (usually positions, normals). */ ++ * mesh'es vertex components (usually positions, normals). ++ * Note! Currently only works with Collada loader.*/ + C_STRUCT aiAnimMesh** mAnimMeshes; + +- ++ /** Method of morphing when animeshes are specified. */ ++ unsigned int mMethod; ++ + #ifdef __cplusplus + + //! Default constructor. Initializes all members to 0 +@@ -732,7 +759,6 @@ struct aiMesh + #endif // __cplusplus + }; + +- + #ifdef __cplusplus + } + #endif //! extern "C" +-- +2.9.3 + diff --git a/0978918f7148fbcd3d05cc6573dae7859975a895.patch b/0978918f7148fbcd3d05cc6573dae7859975a895.patch deleted file mode 100644 index b5c1569..0000000 --- a/0978918f7148fbcd3d05cc6573dae7859975a895.patch +++ /dev/null @@ -1,24 +0,0 @@ -diff -rupN --no-dereference assimp-6.0.2/code/AssetLib/Q3D/Q3DLoader.cpp assimp-6.0.2-new/code/AssetLib/Q3D/Q3DLoader.cpp ---- assimp-6.0.2/code/AssetLib/Q3D/Q3DLoader.cpp 2025-06-08 21:50:39.000000000 +0200 -+++ assimp-6.0.2-new/code/AssetLib/Q3D/Q3DLoader.cpp 2025-12-14 20:02:55.733930684 +0100 -@@ -55,6 +55,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE - #include - #include - -+#include -+ - namespace Assimp { - - static constexpr aiImporterDesc desc = { -@@ -309,6 +311,11 @@ void Q3DImporter::InternReadFile(const s - throw DeadlyImportError("Quick3D: Invalid texture. Width or height is zero"); - } - -+ const unsigned int uint_max = std::numeric_limits::max(); -+ if (tex->mWidth > (uint_max / tex->mHeight)) { -+ throw DeadlyImportError("Quick3D: Texture dimensions are too large, resulting in overflow."); -+ } -+ - unsigned int mul = tex->mWidth * tex->mHeight; - aiTexel *begin = tex->pcData = new aiTexel[mul]; - aiTexel *const end = &begin[mul - 1] + 1; diff --git a/assimp-3.2.0-pythonpath.patch b/assimp-3.2.0-pythonpath.patch new file mode 100644 index 0000000..0ef9d95 --- /dev/null +++ b/assimp-3.2.0-pythonpath.patch @@ -0,0 +1,19 @@ +diff -up ./port/PyAssimp/pyassimp/helper.py.pythonpath ./port/PyAssimp/pyassimp/helper.py +--- ./port/PyAssimp/pyassimp/helper.py.pythonpath 2016-05-21 19:54:37.152745935 -0400 ++++ ./port/PyAssimp/pyassimp/helper.py 2016-05-21 19:57:28.578516453 -0400 +@@ -22,6 +22,7 @@ additional_dirs, ext_whitelist = [],[] + # depending on the platform we're running on. + if os.name=='posix': + additional_dirs.append('./') ++ additional_dirs.append('/usr/lib64/') + additional_dirs.append('/usr/lib/') + additional_dirs.append('/usr/local/lib/') + +@@ -29,6 +30,7 @@ if os.name=='posix': + # currently there's always a symlink called + # libassimp.so in /usr/local/lib. + ext_whitelist.append('.so') ++ ext_whitelist.append('.3') + # libassimp.dylib in /usr/local/lib + ext_whitelist.append('.dylib') + diff --git a/assimp-3.3.1-install-pkgconfig.patch b/assimp-3.3.1-install-pkgconfig.patch new file mode 100644 index 0000000..6a45f68 --- /dev/null +++ b/assimp-3.3.1-install-pkgconfig.patch @@ -0,0 +1,13 @@ +--- assimp-3.3.1/assimp.pc.in.fedora 2017-05-18 07:19:36.251314963 +0200 ++++ assimp-3.3.1/assimp.pc.in 2017-05-18 07:20:26.038525493 +0200 +@@ -1,7 +1,7 @@ + prefix=@CMAKE_INSTALL_PREFIX@ +-exec_prefix=@CMAKE_INSTALL_PREFIX@/@ASSIMP_BIN_INSTALL_DIR@ +-libdir=@CMAKE_INSTALL_PREFIX@/@ASSIMP_LIB_INSTALL_DIR@ +-includedir=@CMAKE_INSTALL_PREFIX@/@ASSIMP_INCLUDE_INSTALL_DIR@/assimp ++exec_prefix=@ASSIMP_BIN_INSTALL_DIR@ ++libdir=@ASSIMP_LIB_INSTALL_DIR@ ++includedir=@ASSIMP_INCLUDE_INSTALL_DIR@/assimp + + Name: @CMAKE_PROJECT_NAME@ + Description: Import various well-known 3D model formats in an uniform manner. diff --git a/assimp-3.3.1-namespace-bigendian.patch b/assimp-3.3.1-namespace-bigendian.patch new file mode 100644 index 0000000..28b5d89 --- /dev/null +++ b/assimp-3.3.1-namespace-bigendian.patch @@ -0,0 +1,12 @@ +diff -up assimp-3.3.1/code/ByteSwapper.h.than assimp-3.3.1/code/ByteSwapper.h +diff -up assimp-3.3.1/code/glTFAsset.inl.than assimp-3.3.1/code/glTFAsset.inl +--- assimp-3.3.1/code/glTFAsset.inl.than 2017-05-05 17:28:29.754976483 -0400 ++++ assimp-3.3.1/code/glTFAsset.inl 2017-05-05 17:28:52.995404721 -0400 +@@ -40,6 +40,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE + + #include "StringUtils.h" + ++using namespace Assimp; + namespace glTF { + + namespace { diff --git a/assimp-3.3.1-unbundle.patch b/assimp-3.3.1-unbundle.patch new file mode 100644 index 0000000..c28474b --- /dev/null +++ b/assimp-3.3.1-unbundle.patch @@ -0,0 +1,201 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 8455bb8..c8e0d88 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -211,6 +211,26 @@ IF ( ASSIMP_NO_EXPORT ) + MESSAGE( STATUS "Build an import-only version of Assimp." ) + ENDIF( ASSIMP_NO_EXPORT ) + ++# Search for poly2tri ++FIND_LIBRARY(POLY2TRI_LIB poly2tri HINTS ${POLY2TRI_LIB_PATH}) ++FIND_FILE(POLY2TRI_H poly2tri.h PATHS ${POLY2TRI_INCLUDE_PATH}) ++IF (POLY2TRI_LIB AND POLY2TRI_H) ++ message(status "Found External poly2tri") ++ SET(HAVE_POLY2TRI true) ++ELSE(POLY2TRI_LIB AND POLY2TRI_H) ++ SET(HAVE_POLY2TRI false) ++ENDIF(POLY2TRI_LIB AND POLY2TRI_H) ++ ++# Search for clipper ++FIND_LIBRARY(CLIPPER_LIB polyclipping HINTS ${CLIPPER_LIB_PATH}) ++FIND_FILE(CLIPPER_H clipper.hpp PATHS ${CLIPPER_INCLUDE_PATH}) ++IF (CLIPPER_LIB AND CLIPPER_H) ++ message(status "Found External clipper") ++ SET(HAVE_CLIPPER true) ++ELSE(CLIPPER_LIB AND CLIPPER_H) ++ SET(HAVE_CLIPPER false) ++ENDIF(CLIPPER_LIB AND CLIPPER_H) ++ + SET ( ASSIMP_BUILD_ARCHITECTURE "" CACHE STRING + "describe the current architecture." + ) +diff --git a/code/BlenderTessellator.h b/code/BlenderTessellator.h +index 530bd2c..a6c9d9e 100644 +--- a/code/BlenderTessellator.h ++++ b/code/BlenderTessellator.h +@@ -142,7 +142,7 @@ namespace Assimp + + #if ASSIMP_BLEND_WITH_POLY_2_TRI + +-#include "../contrib/poly2tri/poly2tri/poly2tri.h" ++#include "poly2tri/poly2tri.h" + + namespace Assimp + { +diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt +index 35ecf50..d549c89 100644 +--- a/code/CMakeLists.txt ++++ b/code/CMakeLists.txt +@@ -655,12 +655,15 @@ SET( ConvertUTF_SRCS + ) + SOURCE_GROUP( ConvertUTF FILES ${ConvertUTF_SRCS}) + ++if (NOT HAVE_CLIPPER) + SET( Clipper_SRCS + ../contrib/clipper/clipper.hpp + ../contrib/clipper/clipper.cpp + ) + SOURCE_GROUP( Clipper FILES ${Clipper_SRCS}) +- ++else (NOT HAVE_CLIPPER) ++SET( Clipper_SRCS "") ++endif(NOT HAVE_CLIPPER) + + SET( Poly2Tri_SRCS + ../contrib/poly2tri/poly2tri/common/shapes.cc +@@ -743,8 +746,6 @@ SET( assimp_src + # Third-party libraries + ${IrrXML_SRCS} + ${ConvertUTF_SRCS} +- ${unzip_compile_SRCS} +- ${Poly2Tri_SRCS} + ${Clipper_SRCS} + ${openddl_parser_SRCS} + # Necessary to show the headers in the project when using the VC++ generator: +@@ -753,6 +754,8 @@ SET( assimp_src + ${COMPILER_HEADERS} + + ) ++ ++ + ADD_DEFINITIONS( -DOPENDDLPARSER_BUILD ) + + INCLUDE_DIRECTORIES( +@@ -821,6 +824,19 @@ else (UNZIP_FOUND) + INCLUDE_DIRECTORIES("../") + endif (UNZIP_FOUND) + ++if (HAVE_POLY2TRI) ++ INCLUDE_DIRECTORIES(${POLY2TRI_INCLUDE_PATH}) ++ TARGET_LINK_LIBRARIES(assimp ${POLY2TRI_LIB}) ++endif(HAVE_POLY2TRI) ++ ++if (HAVE_CLIPPER) ++ INCLUDE_DIRECTORIES(${CLIPPER_INCLUDE_PATH}) ++ TARGET_LINK_LIBRARIES(assimp ${CLIPPER_LIB}) ++else (HAVE_CLIPPER) ++ INCLUDE_DIRECTORIES(../contrib/clipper) ++endif(HAVE_CLIPPER) ++ ++ + INSTALL( TARGETS assimp + LIBRARY DESTINATION ${ASSIMP_LIB_INSTALL_DIR} + ARCHIVE DESTINATION ${ASSIMP_LIB_INSTALL_DIR} +diff --git a/code/D3MFImporter.cpp b/code/D3MFImporter.cpp +index 1a97168..7377eb4 100644 +--- a/code/D3MFImporter.cpp ++++ b/code/D3MFImporter.cpp +@@ -44,7 +44,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include ++#include + #include "irrXMLWrapper.h" + #include "StringComparison.h" + #include "StringUtils.h" +diff --git a/code/D3MFOpcPackage.cpp b/code/D3MFOpcPackage.cpp +index 7cc1dd5..2b007db 100644 +--- a/code/D3MFOpcPackage.cpp ++++ b/code/D3MFOpcPackage.cpp +@@ -42,7 +42,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "D3MFOpcPackage.h" + #include "Exceptional.h" + +-#include ++#include + #include + #include + #include +diff --git a/code/IFCGeometry.cpp b/code/IFCGeometry.cpp +index 5a2e4a0..0926498 100644 +--- a/code/IFCGeometry.cpp ++++ b/code/IFCGeometry.cpp +@@ -49,8 +49,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "PolyTools.h" + #include "ProcessHelper.h" + +-#include "../contrib/poly2tri/poly2tri/poly2tri.h" +-#include "../contrib/clipper/clipper.hpp" ++#include "poly2tri/poly2tri.h" ++#include "clipper.hpp" + #include + + #include +diff --git a/code/IFCLoader.cpp b/code/IFCLoader.cpp +index 34977f5..bc655c0 100644 +--- a/code/IFCLoader.cpp ++++ b/code/IFCLoader.cpp +@@ -50,7 +50,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + + #ifndef ASSIMP_BUILD_NO_COMPRESSED_IFC +-# include ++# include + #endif + + #include "IFCLoader.h" +diff --git a/code/IFCOpenings.cpp b/code/IFCOpenings.cpp +index 51ea143..f0915fb 100644 +--- a/code/IFCOpenings.cpp ++++ b/code/IFCOpenings.cpp +@@ -49,8 +49,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "PolyTools.h" + #include "ProcessHelper.h" + +-#include "../contrib/poly2tri/poly2tri/poly2tri.h" +-#include "../contrib/clipper/clipper.hpp" ++#include "poly2tri/poly2tri.h" ++#include "clipper.hpp" + + #include + +diff --git a/code/Q3BSPZipArchive.h b/code/Q3BSPZipArchive.h +index e46a11b..da93e5c 100644 +--- a/code/Q3BSPZipArchive.h ++++ b/code/Q3BSPZipArchive.h +@@ -40,7 +40,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #ifndef AI_Q3BSP_ZIPARCHIVE_H_INC + #define AI_Q3BSP_ZIPARCHIVE_H_INC + +-#include ++#include + #include + #include + #include +diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt +index df0139d..8b26f22 100644 +--- a/test/CMakeLists.txt ++++ b/test/CMakeLists.txt +@@ -37,7 +37,8 @@ + #---------------------------------------------------------------------- + cmake_minimum_required( VERSION 2.6 ) + +-INCLUDE( AddGTest ) ++# Search for Google Test ++FIND_PACKAGE(GTest) + + INCLUDE_DIRECTORIES( + ${Assimp_SOURCE_DIR}/include +diff --git a/tools/assimp_cmd/CMakeLists.txt b/tools/assimp_cmd/CMakeLists.txt +index f8af93a..3f9a902 100644 diff --git a/assimp-docs.patch b/assimp-docs.patch deleted file mode 100644 index 5d13c1e..0000000 --- a/assimp-docs.patch +++ /dev/null @@ -1,37 +0,0 @@ -diff -rupN --no-dereference assimp-6.0.2/doc/CMakeLists.txt assimp-6.0.2-new/doc/CMakeLists.txt ---- assimp-6.0.2/doc/CMakeLists.txt 2025-06-08 21:50:39.000000000 +0200 -+++ assimp-6.0.2-new/doc/CMakeLists.txt 2025-08-17 10:36:53.475374100 +0200 -@@ -33,9 +33,9 @@ if( DEFINED CMAKE_INSTALL_DOCDIR ) - DESTINATION ${CMAKE_INSTALL_DOCDIR} - ) - install(FILES -- ${CMAKE_CURRENT_SOURCE_DIR}/AssimpDoc_Html/AnimationOverview.png -- ${CMAKE_CURRENT_SOURCE_DIR}/AssimpDoc_Html/AnimationOverview.svg -- ${CMAKE_CURRENT_SOURCE_DIR}/AssimpDoc_Html/dragonsplash.png -+ ${CMAKE_CURRENT_SOURCE_DIR}/architecture/AnimationOverview.png -+ ${CMAKE_CURRENT_SOURCE_DIR}/architecture/AnimationOverview.svg -+ ${CMAKE_CURRENT_SOURCE_DIR}/images/dragonsplash.png - DESTINATION ${CMAKE_INSTALL_DOCDIR}/${HTML_OUTPUT} - ) - endif() -diff -rupN --no-dereference assimp-6.0.2/doc/Doxyfile.in assimp-6.0.2-new/doc/Doxyfile.in ---- assimp-6.0.2/doc/Doxyfile.in 2025-06-08 21:50:39.000000000 +0200 -+++ assimp-6.0.2-new/doc/Doxyfile.in 2025-08-17 10:36:53.474954432 +0200 -@@ -952,7 +952,7 @@ RECURSIVE = NO - # Note that relative paths are relative to the directory from which doxygen is - # run. - --EXCLUDE = -+EXCLUDE = @PROJECT_BINARY_DIR@ - - # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or - # directories that are symbolic links (a Unix file system feature) are excluded -@@ -1221,7 +1221,7 @@ GENERATE_HTML = YES - # The default directory is: html. - # This tag requires that the tag GENERATE_HTML is set to YES. - --HTML_OUTPUT = html -+HTML_OUTPUT = AssimpDoc_Html - - # The HTML_FILE_EXTENSION tag can be used to specify the file extension for each - # generated HTML page (for example: .htm, .php, .asp). diff --git a/assimp-nozlib.patch b/assimp-nozlib.patch deleted file mode 100644 index 8a69587..0000000 --- a/assimp-nozlib.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -rupN --no-dereference assimp-6.0.2/contrib/zlib/CMakeLists.txt assimp-6.0.2-new/contrib/zlib/CMakeLists.txt ---- assimp-6.0.2/contrib/zlib/CMakeLists.txt 2025-06-08 21:50:39.000000000 +0200 -+++ assimp-6.0.2-new/contrib/zlib/CMakeLists.txt 2025-08-17 10:36:53.187611066 +0200 -@@ -196,7 +196,7 @@ if(MINGW) - set(ZLIB_DLL_SRCS ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj) - endif(MINGW) - --add_library(zlibstatic STATIC ${ZLIB_SRCS} ${ZLIB_ASMS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}) -+add_library(zlibstatic OBJECT ${ZLIB_SRCS} ${ZLIB_ASMS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}) - - IF(ASSIMP_INSTALL) - INSTALL( TARGETS zlibstatic diff --git a/assimp-pythonpath.patch b/assimp-pythonpath.patch deleted file mode 100644 index 1a613ed..0000000 --- a/assimp-pythonpath.patch +++ /dev/null @@ -1,19 +0,0 @@ -diff -rupN --no-dereference assimp-6.0.2/port/PyAssimp/pyassimp/helper.py assimp-6.0.2-new/port/PyAssimp/pyassimp/helper.py ---- assimp-6.0.2/port/PyAssimp/pyassimp/helper.py 2025-06-08 21:50:39.000000000 +0200 -+++ assimp-6.0.2-new/port/PyAssimp/pyassimp/helper.py 2025-08-17 10:36:52.891631207 +0200 -@@ -29,6 +29,7 @@ additional_dirs, ext_whitelist = [],[] - # depending on the platform we're running on. - if os.name=='posix': - additional_dirs.append('./') -+ additional_dirs.append('/usr/lib64/') - additional_dirs.append('/usr/lib/') - additional_dirs.append('/usr/lib/x86_64-linux-gnu/') - additional_dirs.append('/usr/lib/aarch64-linux-gnu/') -@@ -54,6 +55,7 @@ if os.name=='posix': - # currently there's always a symlink called - # libassimp.so in /usr/local/lib. - ext_whitelist.append('.so') -+ ext_whitelist.append('.3') - # libassimp.dylib in /usr/local/lib - ext_whitelist.append('.dylib') - diff --git a/assimp-tests.patch b/assimp-tests.patch deleted file mode 100644 index d5ae99a..0000000 --- a/assimp-tests.patch +++ /dev/null @@ -1,28 +0,0 @@ -diff -rupN --no-dereference assimp-6.0.2/CMakeLists.txt assimp-6.0.2-new/CMakeLists.txt ---- assimp-6.0.2/CMakeLists.txt 2025-06-08 21:50:39.000000000 +0200 -+++ assimp-6.0.2-new/CMakeLists.txt 2025-08-17 10:36:53.765126531 +0200 -@@ -813,6 +813,7 @@ IF ( ASSIMP_BUILD_SAMPLES ) - ENDIF () - - IF ( ASSIMP_BUILD_TESTS ) -+ ENABLE_TESTING() - ADD_SUBDIRECTORY( test/ ) - ENDIF () - -diff -rupN --no-dereference assimp-6.0.2/test/CMakeLists.txt assimp-6.0.2-new/test/CMakeLists.txt ---- assimp-6.0.2/test/CMakeLists.txt 2025-08-17 10:36:52.887323815 +0200 -+++ assimp-6.0.2-new/test/CMakeLists.txt 2025-08-17 10:36:53.765489323 +0200 -@@ -36,6 +36,7 @@ - # - #---------------------------------------------------------------------- - cmake_minimum_required( VERSION 3.10 ) -+include(GoogleTest) - - INCLUDE_DIRECTORIES( - ${Assimp_SOURCE_DIR}/test/unit -@@ -267,4 +268,4 @@ target_link_libraries( unit assimp ${pla - - add_subdirectory(headercheck) - --add_test( unittests unit ) -+gtest_discover_tests(unit) diff --git a/assimp-unbundle.patch b/assimp-unbundle.patch deleted file mode 100644 index 125551d..0000000 --- a/assimp-unbundle.patch +++ /dev/null @@ -1,248 +0,0 @@ -diff -rupN --no-dereference assimp-6.0.2/code/AssetLib/Blender/BlenderTessellator.h assimp-6.0.2-new/code/AssetLib/Blender/BlenderTessellator.h ---- assimp-6.0.2/code/AssetLib/Blender/BlenderTessellator.h 2025-06-08 21:50:39.000000000 +0200 -+++ assimp-6.0.2-new/code/AssetLib/Blender/BlenderTessellator.h 2025-08-18 20:15:00.250159883 +0200 -@@ -143,7 +143,7 @@ namespace Assimp - - #if ASSIMP_BLEND_WITH_POLY_2_TRI - --#include "contrib/poly2tri/poly2tri/poly2tri.h" -+#include - - namespace Assimp - { -diff -rupN --no-dereference assimp-6.0.2/code/AssetLib/IFC/IFCGeometry.cpp assimp-6.0.2-new/code/AssetLib/IFC/IFCGeometry.cpp ---- assimp-6.0.2/code/AssetLib/IFC/IFCGeometry.cpp 2025-06-08 21:50:39.000000000 +0200 -+++ assimp-6.0.2-new/code/AssetLib/IFC/IFCGeometry.cpp 2025-08-18 20:15:00.250503229 +0200 -@@ -45,7 +45,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE - #include "IFCUtil.h" - #include "Common/PolyTools.h" - #include "PostProcessing/ProcessHelper.h" --#include "contrib/poly2tri/poly2tri/poly2tri.h" -+#include - #include "contrib/clipper/clipper.hpp" - - #include -diff -rupN --no-dereference assimp-6.0.2/code/AssetLib/IFC/IFCOpenings.cpp assimp-6.0.2-new/code/AssetLib/IFC/IFCOpenings.cpp ---- assimp-6.0.2/code/AssetLib/IFC/IFCOpenings.cpp 2025-06-08 21:50:39.000000000 +0200 -+++ assimp-6.0.2-new/code/AssetLib/IFC/IFCOpenings.cpp 2025-08-18 20:15:00.250876754 +0200 -@@ -47,7 +47,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE - #include "IFCUtil.h" - #include "Common/PolyTools.h" - #include "PostProcessing/ProcessHelper.h" --#include "contrib/poly2tri/poly2tri/poly2tri.h" -+#include - #include "contrib/clipper/clipper.hpp" - - #include -diff -rupN --no-dereference assimp-6.0.2/code/CMakeLists.txt assimp-6.0.2-new/code/CMakeLists.txt ---- assimp-6.0.2/code/CMakeLists.txt 2025-06-08 21:50:39.000000000 +0200 -+++ assimp-6.0.2-new/code/CMakeLists.txt 2025-08-18 20:15:00.254124936 +0200 -@@ -1120,13 +1120,7 @@ IF(ASSIMP_HUNTER_ENABLED) - hunter_add_package(pugixml) - find_package(pugixml CONFIG REQUIRED) - ELSEIF(NOT TARGET pugixml::pugixml) -- SET( Pugixml_SRCS -- ../contrib/pugixml/src/pugiconfig.hpp -- ../contrib/pugixml/src/pugixml.cpp -- ../contrib/pugixml/src/pugixml.hpp -- ) -- INCLUDE_DIRECTORIES("../contrib/pugixml/src") -- SOURCE_GROUP( Contrib\\Pugixml FILES ${Pugixml_SRCS}) -+ find_package(pugixml REQUIRED) - ENDIF() - - # utf8 -@@ -1134,7 +1128,7 @@ IF(ASSIMP_HUNTER_ENABLED) - hunter_add_package(utf8) - find_package(utf8cpp CONFIG REQUIRED) - ELSE() -- INCLUDE_DIRECTORIES("../contrib/utf8cpp/source") -+ find_package(utf8cpp CONFIG REQUIRED) - ENDIF() - - # polyclipping -@@ -1150,10 +1144,10 @@ ENDIF() - #ENDIF() - - # poly2tri --#IF(ASSIMP_HUNTER_ENABLED) --# hunter_add_package(poly2tri) --# find_package(poly2tri CONFIG REQUIRED) --#ELSE() -+IF(HAVE_POLY2TRI) -+ include_directories(${POLY2TRI_INCLUDE_PATH}) -+ set(Poly2Tri_SRCS "") -+ELSE() - SET( Poly2Tri_SRCS - ../contrib/poly2tri/poly2tri/common/shapes.cc - ../contrib/poly2tri/poly2tri/common/shapes.h -@@ -1168,13 +1162,13 @@ ENDIF() - ../contrib/poly2tri/poly2tri/sweep/sweep_context.h - ) - SOURCE_GROUP( Contrib\\Poly2Tri FILES ${Poly2Tri_SRCS}) --#ENDIF() -+ENDIF() - - # minizip/unzip --IF(ASSIMP_HUNTER_ENABLED) -- hunter_add_package(minizip) -- find_package(minizip CONFIG REQUIRED) --ELSE() -+#IF(ASSIMP_HUNTER_ENABLED) -+# hunter_add_package(minizip) -+# find_package(minizip CONFIG REQUIRED) -+#ELSE() - SET( unzip_SRCS - ../contrib/unzip/crypt.h - ../contrib/unzip/ioapi.c -@@ -1183,7 +1177,7 @@ ELSE() - ../contrib/unzip/unzip.h - ) - SOURCE_GROUP(Contrib\\unzip FILES ${unzip_SRCS}) --ENDIF() -+#ENDIF() - - # zip (https://github.com/kuba--/zip) - separate_arguments(ASSIMP_EXPORTERS_LIST UNIX_COMMAND ${ASSIMP_EXPORTERS_ENABLED}) -@@ -1279,6 +1273,7 @@ ENDIF () - IF (NOT ASSIMP_HUNTER_ENABLED AND (RT_FOUND OR WIN32)) - SET( ASSIMP_IMPORTER_GLTF_USE_OPEN3DGC 1 ) - ADD_DEFINITIONS( -DASSIMP_IMPORTER_GLTF_USE_OPEN3DGC=1 ) -+ INCLUDE_DIRECTORIES( "../contrib" ) - ELSE () - SET (open3dgc_SRCS "") - MESSAGE (INFO " Hunter enabled or RT-extension not found. glTF import/export will be built without Open3DGC-compression.") -@@ -1290,7 +1285,8 @@ IF(ASSIMP_HUNTER_ENABLED) - hunter_add_package(RapidJSON) - find_package(RapidJSON CONFIG REQUIRED) - ELSE() -- INCLUDE_DIRECTORIES("../contrib/rapidjson/include") -+ find_package(RapidJSON REQUIRED) -+ include_directories(${RapidJSON_INCLUDE_DIRS}) - ADD_DEFINITIONS( -DRAPIDJSON_HAS_STDSTRING=1) - option( ASSIMP_RAPIDJSON_NO_MEMBER_ITERATOR "Suppress rapidjson warning on MSVC (NOTE: breaks android build)" ON ) - if(ASSIMP_RAPIDJSON_NO_MEMBER_ITERATOR) -@@ -1303,11 +1299,6 @@ IF(ASSIMP_HUNTER_ENABLED) - hunter_add_package(stb) - find_package(stb CONFIG REQUIRED) - ELSE() -- SET( stb_SRCS -- ../contrib/stb/stb_image.h -- ) -- INCLUDE_DIRECTORIES("../contrib") -- SOURCE_GROUP( Contrib\\stb FILES ${stb_SRCS}) - ENDIF() - - # VC2010 fixes -@@ -1489,7 +1480,6 @@ IF(ASSIMP_HUNTER_ENABLED) - TARGET_LINK_LIBRARIES(assimp - PUBLIC - openddlparser::openddl_parser -- minizip::minizip - ZLIB::zlib - RapidJSON::rapidjson - utf8cpp -@@ -1508,9 +1498,16 @@ ELSE() - if (ASSIMP_BUILD_DRACO) - target_link_libraries(assimp ${draco_LIBRARIES}) - endif() -- if(TARGET pugixml::pugixml) -- target_link_libraries(assimp pugixml::pugixml) -- endif() -+ -+ TARGET_LINK_LIBRARIES(assimp pugixml) -+ -+ IF (HAVE_POLY2TRI) -+ TARGET_LINK_LIBRARIES(assimp ${POLY2TRI_LIB}) -+ ENDIF() -+ -+ IF (HAVE_CLIPPER) -+ TARGET_LINK_LIBRARIES(assimp ${CLIPPER_LIB}) -+ ENDIF() - ENDIF() - - if(ASSIMP_ANDROID_JNIIOSYSTEM) -diff -rupN --no-dereference assimp-6.0.2/code/PostProcessing/TriangulateProcess.cpp assimp-6.0.2-new/code/PostProcessing/TriangulateProcess.cpp ---- assimp-6.0.2/code/PostProcessing/TriangulateProcess.cpp 2025-06-08 21:50:39.000000000 +0200 -+++ assimp-6.0.2-new/code/PostProcessing/TriangulateProcess.cpp 2025-08-18 20:15:00.251686318 +0200 -@@ -62,7 +62,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE - #include "PostProcessing/TriangulateProcess.h" - #include "PostProcessing/ProcessHelper.h" - #include "Common/PolyTools.h" --#include "contrib/earcut-hpp/earcut.hpp" -+#include - - #include - #include -diff -rupN --no-dereference assimp-6.0.2/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp assimp-6.0.2-new/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp ---- assimp-6.0.2/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp 2025-06-08 21:50:39.000000000 +0200 -+++ assimp-6.0.2-new/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp 2025-08-18 20:15:00.252020642 +0200 -@@ -24,7 +24,7 @@ - #endif // _MSC_VER - - #define STB_IMAGE_IMPLEMENTATION --#include "contrib/stb/stb_image.h" -+#include "stb_image.h" - - #ifdef _MSC_VER - #pragma warning(default: 4100) // Enable warning 'unreferenced formal parameter' -diff -rupN --no-dereference assimp-6.0.2/test/CMakeLists.txt assimp-6.0.2-new/test/CMakeLists.txt ---- assimp-6.0.2/test/CMakeLists.txt 2025-06-08 21:50:39.000000000 +0200 -+++ assimp-6.0.2-new/test/CMakeLists.txt 2025-08-18 20:15:00.253409037 +0200 -@@ -43,14 +43,6 @@ INCLUDE_DIRECTORIES( - ${Assimp_SOURCE_DIR}/code - ) - --if(NOT ASSIMP_HUNTER_ENABLED) -- INCLUDE_DIRECTORIES( -- ${Assimp_SOURCE_DIR}/contrib/googletest/googletest/include -- ${Assimp_SOURCE_DIR}/contrib/googletest/googletest/ -- ${Assimp_SOURCE_DIR}/contrib/pugixml/src -- ) --endif() -- - if (MSVC) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING") - endif() -@@ -234,26 +226,11 @@ add_executable( unit - ${POST_PROCESSES} - ) - --if(ASSIMP_HUNTER_ENABLED) -- hunter_add_package(GTest) -- find_package(GTest CONFIG REQUIRED) -- target_link_libraries(unit GTest::gtest_main GTest::gmock) --else() -- target_sources(unit PUBLIC ${Assimp_SOURCE_DIR}/contrib/googletest/googletest/src/gtest-all.cc) --endif() -+find_package(GTest CONFIG REQUIRED) -+target_link_libraries(unit GTest::gtest_main GTest::gmock) - - # RapidJSON --IF(ASSIMP_HUNTER_ENABLED) -- hunter_add_package(RapidJSON) -- find_package(RapidJSON CONFIG REQUIRED) --ELSE() -- INCLUDE_DIRECTORIES("../contrib/rapidjson/include") -- ADD_DEFINITIONS( -DRAPIDJSON_HAS_STDSTRING=1) -- option( ASSIMP_RAPIDJSON_NO_MEMBER_ITERATOR "Suppress rapidjson warning on MSVC (NOTE: breaks android build)" ON ) -- if(ASSIMP_RAPIDJSON_NO_MEMBER_ITERATOR) -- ADD_DEFINITIONS( -DRAPIDJSON_NOMEMBERITERATORCLASS ) -- endif() --ENDIF() -+find_package(RapidJSON CONFIG REQUIRED) - - IF (ASSIMP_BUILD_DRACO) - ADD_DEFINITIONS( -DASSIMP_ENABLE_DRACO ) -diff -rupN --no-dereference assimp-6.0.2/test/unit/utglTF2ImportExport.cpp assimp-6.0.2-new/test/unit/utglTF2ImportExport.cpp ---- assimp-6.0.2/test/unit/utglTF2ImportExport.cpp 2025-06-08 21:50:39.000000000 +0200 -+++ assimp-6.0.2-new/test/unit/utglTF2ImportExport.cpp 2025-08-18 20:15:00.253778700 +0200 -@@ -986,7 +986,7 @@ namespace { - rapidjson::Document schemaDoc; - schemaDoc.Parse(R"==({"properties":{"scene" : { "type" : "integer" }}, "required": [ "scene" ]})=="); - EXPECT_FALSE(schemaDoc.HasParseError()); -- m_schema.reset(new rapidjson::SchemaDocument(schemaDoc, m_schemaName.c_str(), static_cast(m_schemaName.size()), this)); -+ m_schema.reset(new rapidjson::SchemaDocument(schemaDoc, 0, 0, this)); - } - - const rapidjson::SchemaDocument* GetRemoteDocument(const char* uri, rapidjson::SizeType) override { diff --git a/assimp.spec b/assimp.spec index c5adec9..e8b1943 100644 --- a/assimp.spec +++ b/assimp.spec @@ -1,73 +1,57 @@ -%define soversion 6 - Name: assimp -Version: 6.0.2 -Release: 6%{?dist} +Version: 3.3.1 +Release: 12%{?dist} Summary: Library to import various 3D model formats into applications - -# Assimp is BSD -# Bundled contrib/clipper is Boost -# Bundled contrib/Open3DGC is MIT -# Bundled contrib/openddlparser is MIT -# Bundled contrib/stb is MIT -# Bundled contrib/unzip is zlib -# Bundled contrib/zip is unlicense -# Bundled contrib/zlib is zlib -License: BSD-3-Clause AND MIT AND BSL-1.0 AND Unlicense AND Zlib -URL: https://github.com/assimp/assimp - +Group: Development/Libraries +# Assimp is BSD, the bundled openddlparser is MIT. +License: BSD and MIT +URL: http://assimp.sourceforge.net +#Source0: https://github.com/assimp/%{name}/archive/%{commit0}.tar.gz#/%{name}-%{shortcommit0}.tar.gz # Github releases include nonfree models, source tarball must be re-generated # using assimp_generate_tarball.sh Source0: %{name}-%{version}-free.tar.xz Source1: assimp_generate_tarball.sh - -# Un-bundle poly2tri, pugixml, utf8cpp, RapidJSON, clipper -Patch0: %{name}-unbundle.patch +# Current 3.3.1 not compilable under s390x and ppc64le - BigEndian issues +Patch0: %{name}-3.3.1-unbundle.patch # Add /usr/lib64 to library lookup paths for python modules -Patch1: %{name}-pythonpath.patch -# Prevent export of bundled zlibstatic library -Patch2: %{name}-nozlib.patch -# Exclude the build directory from the doxygen-generated documentation -# Fix HTML_OUTPUT dir in doxyfile -# Fix installing images from doc/architecture -Patch3: %{name}-docs.patch -# Enable ctest -Patch4: %{name}-tests.patch -# Backport fix for CVE-2025-11277 -Patch5: https://github.com/assimp/assimp/commit/0978918f7148fbcd3d05cc6573dae7859975a895.patch -# PyAssimp: Re-add 'aiProcess_Triangulate' (#2423174) -Patch6: https://github.com/assimp/assimp/commit/dd98d4aea3d9d2b3544540ea44eeb15c3616dbb7.patch - - -BuildRequires: boost-devel -BuildRequires: cmake -BuildRequires: doxygen -BuildRequires: earcut-hpp-devel -BuildRequires: gcc-c++ -BuildRequires: gtest-devel -BuildRequires: make -BuildRequires: pkgconfig(python3) -BuildRequires: poly2tri-devel -BuildRequires: pugixml-devel -BuildRequires: python3-devel -BuildRequires: zlib-devel -# Need to BR -static packages for header-only libraries for tracking, per -# guidelines -BuildRequires: rapidjson-devel -BuildRequires: rapidjson-static -BuildRequires: stb_image-devel -BuildRequires: stb_image-static -BuildRequires: utf8cpp-devel -BuildRequires: utf8cpp-static +Patch1: %{name}-3.2.0-pythonpath.patch +# Fix library and include paths in assimp-config.cmake +# Fixes rhbz#1263698, not submitted upstream +# Rehashed to 3.3.1 +Patch2: 0001-Assimp-cmake-provider-fix.patch +# fix FTBFS on bigendian platform s390x/ppc64 +Patch3: assimp-3.3.1-namespace-bigendian.patch +Patch10: assimp-3.3.1-install-pkgconfig.patch +#Upstream backports +# Collada morph animation +Patch100: 0001-Morph-animation-support-for-collada.patch +# Generate doc from CMakeFiles. Backported from Upstream +Patch101: 0001-Enable-doxygen-been-properly-used-from-cmake-build-a.patch +# Strips bundled irrXML out of build files, and allows project to build +# against system versions of the libraries (not yet submitted upstream) +Patch102: 0001-Apply-mechanism-to-decide-use-for-IrrXML-external-or.patch +BuildRequires: boost-devel +BuildRequires: cmake +BuildRequires: dos2unix +BuildRequires: irrlicht-devel +BuildRequires: irrXML-devel +BuildRequires: doxygen +BuildRequires: poly2tri-devel +BuildRequires: gtest-devel +BuildRequires: pkgconfig(zzip-zlib-config) +BuildRequires: pkgconfig(zlib) +BuildRequires: pkgconfig(minizip) # Incompatible - https://github.com/assimp/assimp/issues/788 #BuildRequires: pkgconfig(polyclipping) -Provides: bundled(polyclipping) = 4.8.8 -Provides: bundled(open3dgc) -Provides: bundled(openddl-parser) -Provides: bundled(unzip) -Provides: bundled(minzip) +Provides: bundled(polyclipping) = 4.8.8 +BuildRequires: pkgconfig(python2) +%if 0%{?fedora} > 23 +BuildRequires: pkgconfig(ILUT) +BuildRequires: pkgconfig(python3) +%endif +Provides: bundled(openddl-parser) %description Assimp, the Open Asset Import Library, is a free library to import @@ -76,27 +60,41 @@ to provide a full asset conversion pipeline for use in game engines and real-time rendering systems, but is not limited to these applications. - %package devel Summary: Header files and libraries for assimp +Group: Development/Libraries Requires: %{name}%{?_isa} = %{version}-%{release} -Requires: poly2tri-devel -Requires: pugixml-devel %description devel This package contains the header files and libraries for assimp. If you would like to develop programs using assimp, you will need to install assimp-devel. - -%package -n python3-%{name} -Summary: Python 3 bindings for assimp +%package -n python2-%{name} +Summary: Python bindings for assimp +Group: Development/Libraries BuildArch: noarch Requires: %{name} = %{version}-%{release} +Requires: python2 +Provides: %{name}-python = %{version}-%{release} +Obsoletes: %{name}-python < 3.1.1 + +%description -n python2-%{name} +This package contains the PyAssimp python bindings + +%if 0%{?fedora} > 23 +%package -n python3-%{name} +Summary: Python 3 bindings for assimp +Group: Development/Libraries +BuildArch: noarch +Requires: %{name} = %{version}-%{release} +Requires: python3 +Provides: %{name}-python3 = %{version}-%{release} +Obsoletes: %{name}-python3 < 3.1.1 %description -n python3-%{name} This package contains the PyAssimp3 python bindings - +%endif %package doc Summary: Assimp documentation @@ -105,237 +103,89 @@ BuildArch: noarch %description doc %{summary}. - %prep -%autosetup -p1 -n %{name}-%{version} -# Get rid of bundled libs so we can't accidently build against them, except: -# - clipper: Unpackaged -# - Open3DGC: Unpackaged -# - openddlparser: Unpackaged -# - tinyusdz: Unpackaged -# - unzip: Modified minizip -# - zip: Modified minizip -find contrib/ -maxdepth 1 -mindepth 1 \ - | grep -Ev '(clipper|Open3DGC|openddlparser|tinyusdz|unzip|zip)' \ - | xargs rm -r - -mv contrib/openddlparser/LICENSE contrib/openddlparser/LICENSE.openddlparser - +%setup -q +# Get rid of bundled libs so we can't accidently build against them +#rm -r contrib/clipper +rm -r contrib/irrXML +rm -r contrib/zlib +rm -r contrib/unzip +rm -r contrib/poly2tri +%patch0 -p1 -b .unbundle +%patch1 -p1 -b .pythonpath +%patch2 -p1 -b .cmakefix +%patch3 -p1 -b .bigendian +# Need to be upstreamed +%patch10 -p1 -b .pkgconfig +# Backported from upstream +%patch100 -p1 -b .docfix +%patch101 -p1 -b .qt3d +%patch102 -p1 -b .systemirrxml %build -%cmake \ +mkdir build +pushd build +%cmake .. \ + -DASSIMP_LIB_INSTALL_DIR=%{_libdir} \ + -DASSIMP_BIN_INSTALL_DIR=%{_bindir} \ + -DASSIMP_INCLUDE_INSTALL_DIR=%{_includedir} \ %ifarch s390x ppc64 -DAI_BUILD_BIG_ENDIAN=TRUE \ %endif - -DASSIMP_WARNINGS_AS_ERRORS=OFF \ - -DASSIMP_BUILD_ASSIMP_TOOLS=ON \ - -DASSIMP_BUILD_DOCS=ON \ - -DASSIMP_IGNORE_GIT_HASH=ON \ - -DHAVE_POLY2TRI=ON \ + -DBUILD_DOCS=ON \ + -DHTML_OUTPUT=%{name}-%{version} \ + -DCMAKE_INSTALL_DOCDIR=%{_docdir} \ -DPOLY2TRI_INCLUDE_PATH=%{_includedir}/poly2tri \ - -DPOLY2TRI_LIB=poly2tri \ - -DCMAKE_INSTALL_DOCDIR=%{_defaultdocdir}/%{name} - -%cmake_build + -DSYSTEM_IRRXML=ON +popd +# To use system polyclipping if assimp ever becomes compatible: +# -DCLIPPER_INCLUDE_PATH=%{_includedir}/polyclipping +make %{?_smp_mflags} -C build +# Fix file encoding +dos2unix README LICENSE CREDITS port/PyAssimp/README.md +iconv -f iso8859-1 -t utf-8 CREDITS > CREDITS.conv && mv -f CREDITS.conv CREDITS %install -%cmake_install +rm -rf %{buildroot} +make -C build install DESTDIR=%{buildroot} +mkdir -p %{buildroot}%{python2_sitelib}/pyassimp/ +install -m0644 port/PyAssimp/pyassimp/*.py %{buildroot}%{python2_sitelib}/pyassimp/ +%if 0%{?fedora} > 23 mkdir -p %{buildroot}%{python3_sitelib}/pyassimp/ install -m0644 port/PyAssimp/pyassimp/*.py %{buildroot}%{python3_sitelib}/pyassimp/ +%endif - -%check -# Exclude tests that rely on nonbsd models -%ctest --exclude-regex "utMD5Importer.importBoarMan|utMD5Importer.importBob|utMD2Importer.importDolphin|utMD2Importer.importFlag|utMD2Importer.importHorse|utQ3BSPImportExport.importerTest|utBlenderImporter.importBob|utBlenderImporter.importFleurOptonl|utPMXImporter.importTest|utXImporter.importDwarf" || : +%post -p /sbin/ldconfig +%postun -p /sbin/ldconfig %files -%license LICENSE -%license contrib/clipper/License.txt -%license contrib/openddlparser/LICENSE.openddlparser -%license contrib/zip/UNLICENSE -%doc Readme.md CREDITS +%license LICENSE +%doc README CREDITS %{_bindir}/assimp -%{_libdir}/libassimp.so.%{version} -%{_libdir}/libassimp.so.%{soversion} +%{_libdir}/*.so.* %files devel -%{_includedir}/assimp/ -%{_libdir}/libassimp.so -%{_libdir}/pkgconfig/assimp.pc -%{_libdir}/cmake/assimp-*/ +%{_includedir}/assimp +%{_libdir}/*.so +%{_libdir}/pkgconfig/*.pc +%{_libdir}/cmake/* %files doc %{_docdir}/* +%files -n python2-%{name} +%doc port/PyAssimp/README.md +%{python_sitelib}/pyassimp + +%if 0%{?fedora} > 23 %files -n python3-%{name} %doc port/PyAssimp/README.md -%{python3_sitelib}/pyassimp/ - +%{python3_sitelib}/pyassimp +%endif %changelog -* Fri Jan 16 2026 Fedora Release Engineering - 6.0.2-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild - -* Sat Dec 27 2025 Sandro Mani - 6.0.2-5 -- PyAssimp: Re-add 'aiProcess_Triangulate' (#2423174) - -* Sun Dec 14 2025 Sandro Mani - 6.0.2-4 -- Backport fix for CVE-2025-11277 - -* Fri Sep 19 2025 Python Maint - 6.0.2-3 -- Rebuilt for Python 3.14.0rc3 bytecode - -* Mon Aug 18 2025 Sandro Mani - 6.0.2-2 -- Fix pugixml::pugixml dependency ending up in link interface of assimp::assimp - -* Fri Aug 15 2025 Sandro Mani - 6.0.2-1 -- Update to 6.0.2 - -* Fri Aug 15 2025 Python Maint - 5.4.3-4 -- Rebuilt for Python 3.14.0rc2 bytecode - -* Wed Jul 23 2025 Fedora Release Engineering - 5.4.3-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild - -* Tue Jun 03 2025 Python Maint - 5.4.3-2 -- Rebuilt for Python 3.14 - -* Sat Mar 15 2025 Rich Mattes - 5.4.3-1 -- Update to release 5.4.3 -- Resolves: #2274012 - -* Thu Jan 16 2025 Fedora Release Engineering - 5.3.1-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild - -* Wed Aug 28 2024 Miroslav Suchý - 5.3.1-4 -- convert license to SPDX - -* Wed Jul 17 2024 Fedora Release Engineering - 5.3.1-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild - -* Sat Jun 08 2024 Python Maint - 5.3.1-2 -- Rebuilt for Python 3.13 - -* Sun Mar 31 2024 Rich Mattes - 5.3.1-1 -- Update to release 5.3.1 -- Resolves: rhbz#2256587 - -* Mon Jan 22 2024 Fedora Release Engineering - 5.2.5-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild - -* Fri Jan 19 2024 Fedora Release Engineering - 5.2.5-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild - -* Wed Jan 03 2024 Scott K Logan - 5.2.5-2 -- Add pugixml and poly2tri devel dependencies to assimp-devel - -* Fri Nov 24 2023 Rich Mattes - 5.2.5-1 -- Add check section and fix ctest configuration - -* Thu Oct 26 2023 Benjamin A. Beasley - 5.2.5-1 -- Ensure stb_image contains the latest CVE patches - -* Fri Jul 28 2023 Scott K Logan - 5.2.5-1 -- Update to release 5.2.5 - -* Wed Jul 19 2023 Fedora Release Engineering - 5.0.1-12 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild - -* Tue Jun 13 2023 Python Maint - 5.0.1-11 -- Rebuilt for Python 3.12 - -* Wed Jan 18 2023 Fedora Release Engineering - 5.0.1-10 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild - -* Wed Jul 20 2022 Fedora Release Engineering - 5.0.1-9 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild - -* Mon Jun 13 2022 Python Maint - 5.0.1-8 -- Rebuilt for Python 3.11 - -* Sat Apr 23 2022 Benjamin A. Beasley - 5.0.1-7 -- Security fix for CVE-2022-28041 -- Drop dependency on pkgconfig(zzip-zlib-config), no longer available in - zziplib; use zlib directly instead - -* Wed Jan 19 2022 Fedora Release Engineering - 5.0.1-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild - -* Thu Dec 30 2021 Rich Mattes - 5.0.1-5 -- Correct Unlicense shortname (rhbz#2036000) - -* Sat Sep 11 2021 Benjamin A. Beasley - 5.0.1-4 -- Unbundle stb_image -- Add -static BR’s for header-only libraries utf8cpp and rapidjson - -* Wed Jul 21 2021 Fedora Release Engineering - 3.3.1-30 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild - -* Fri Jun 04 2021 Python Maint - 3.3.1-29 -- Rebuilt for Python 3.10 - -* Mon Mar 29 2021 Rich Mattes - 5.0.1-3 -- Fix library install dir specification (rhbz#1943862) -- Remove un-needed build dependency on ILUT - -* Tue Mar 23 2021 Scott K Logan - 5.0.1-2 -- Add an upstream patch to fix imported library locations - -* Sat Feb 27 2021 Rich Mattes - 5.0.1-1 -- Update to release 5.0.1 - -* Tue Jan 26 2021 Fedora Release Engineering - 3.3.1-28 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild - -* Tue Aug 18 2020 Jeff Law - 3.3.1-27 -- Fix minor C++17 issues - -* Sat Aug 01 2020 Fedora Release Engineering - 3.3.1-26 -- Second attempt - Rebuilt for - https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild - -* Mon Jul 27 2020 Fedora Release Engineering - 3.3.1-25 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild - -* Tue May 26 2020 Miro Hrončok - 3.3.1-24 -- Rebuilt for Python 3.9 - -* Tue Jan 28 2020 Fedora Release Engineering - 3.3.1-23 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild - -* Thu Oct 03 2019 Miro Hrončok - 3.3.1-22 -- Rebuilt for Python 3.8.0rc1 (#1748018) - -* Mon Aug 19 2019 Miro Hrončok - 3.3.1-21 -- Rebuilt for Python 3.8 - -* Wed Jul 24 2019 Fedora Release Engineering - 3.3.1-20 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild - -* Thu Jan 31 2019 Fedora Release Engineering - 3.3.1-19 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild - -* Mon Jan 14 2019 Miro Hrončok - 3.3.1-18 -- Subpackage python2-assimp has been removed - See https://fedoraproject.org/wiki/Changes/Mass_Python_2_Package_Removal - -* Tue Aug 28 2018 Patrik Novotný - 3.3.1-17 -- update requires to minizip-compat(-devel), rhbz#1609830, rhbz#1615381 - -* Thu Jul 12 2018 Fedora Release Engineering - 3.3.1-16 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild - -* Mon Jul 02 2018 Miro Hrončok - 3.3.1-15 -- Rebuilt for Python 3.7 - -* Wed Feb 07 2018 Fedora Release Engineering - 3.3.1-14 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild - -* Mon Oct 02 2017 Troy Dawson - 3.3.1-13 -- Cleanup spec file conditionals - * Sun Aug 06 2017 Björn Esser - 3.3.1-12 - Rebuilt for AutoReq cmake-filesystem diff --git a/assimp_generate_tarball.sh b/assimp_generate_tarball.sh index 8e880f3..ea1b4cb 100755 --- a/assimp_generate_tarball.sh +++ b/assimp_generate_tarball.sh @@ -1,23 +1,11 @@ #!/bin/bash -if [ $# -lt 1 ]; then - echo "Usage: $0 version" - exit 1 -fi +RELEASE=3.3.1 +git clone -b v${RELEASE} --depth=1 https://github.com/assimp/assimp.git assimp-${RELEASE} -RELEASE=$1 - -if [ ! -f assimp-$RELEASE.tar.gz ]; then - wget https://github.com/assimp/assimp/archive/v$RELEASE/assimp-$RELEASE.tar.gz -fi - -if [ -d assimp-$RELEASE ]; then - rm -fr assimp-$RELEASE -fi - -tar xvf assimp-$RELEASE.tar.gz -cd assimp-$RELEASE +cd assimp-${RELEASE} +git checkout -b free find ./ -name "*.dll" -exec git rm -r {} \; -rm -r test/models-nonbsd +git rm -rf test/models-nonbsd +git commit -m "- Remove non free bits." +git archive --prefix=assimp-${RELEASE}/ free | xz > ../assimp-${RELEASE}-free.tar.xz cd .. - -tar czf assimp-$RELEASE-free.tar.xz assimp-$RELEASE diff --git a/dd98d4aea3d9d2b3544540ea44eeb15c3616dbb7.patch b/dd98d4aea3d9d2b3544540ea44eeb15c3616dbb7.patch deleted file mode 100644 index c29e9fb..0000000 --- a/dd98d4aea3d9d2b3544540ea44eeb15c3616dbb7.patch +++ /dev/null @@ -1,30 +0,0 @@ -diff -rupN --no-dereference assimp-6.0.2/port/PyAssimp/pyassimp/postprocess.py assimp-6.0.2-new/port/PyAssimp/pyassimp/postprocess.py ---- assimp-6.0.2/port/PyAssimp/pyassimp/postprocess.py 2025-06-08 21:50:39.000000000 +0200 -+++ assimp-6.0.2-new/port/PyAssimp/pyassimp/postprocess.py 2025-12-27 19:11:08.846657557 +0100 -@@ -36,13 +36,21 @@ aiProcess_JoinIdenticalVertices = 0x2 - # - aiProcess_MakeLeftHanded = 0x4 - --##
Triangulates all faces of all meshes. -+##
Triangulates all faces of all meshes. - # - # By default the imported mesh data might contain faces with more than 3 --# indices. For rendering you'll usually want all faces to be triangles. --# This post processing stepaiProcess_ForceGenNormals --##
Removes some parts of the data structure (animations, materials, --# light sources, cameras, textures, vertex components). -+# indices. For rendering you'll usually want all faces to be triangles. -+# This post processing step splits up faces with more than 3 indices into -+# triangles. Line and point primitives are *not* modified! If you want -+# 'triangles only' with no other kinds of primitives, try the following -+# solution: -+# - Specify both #aiProcess_Triangulate and #aiProcess_SortByPType -+# - Ignore all point and line meshes when you process assimp's output -+# -+aiProcess_Triangulate = 0x8 -+ -+#
Removes some parts of the data structure (animations, materials, -+# light sources, cameras, textures, vertex components). - # - # The components to be removed are specified in a separate - # configuration option, #AI_CONFIG_PP_RVC_FLAGS. This is quite useful diff --git a/sources b/sources index 0d92271..d56434d 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (assimp-6.0.2-free.tar.xz) = c2895d1185d13fdbd25499e6d916d960f124892de7363e9e91db3ed1daef554ebea462e37cbfafbe5be548e5a962f18fc9f213f836579d97e725c17aae58149b +SHA512 (assimp-3.3.1-free.tar.xz) = 249e7e35a357274d296a457ab6ffff5a06480007db7f327d72869448e5f754740487a8def5ed1e1f2324a68aa5a9c2780092cded3d56d685103974bb32e7d761