diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index a932e5377..e0c2bec9e 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,2 +1,2 @@ patreon: assimp -Paypal: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=4JRJVPXC4QJM4 +custom: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=4JRJVPXC4QJM4 diff --git a/.github/workflows/ccpp.yml b/.github/workflows/ccpp.yml index 103b1ece0..08292d55f 100644 --- a/.github/workflows/ccpp.yml +++ b/.github/workflows/ccpp.yml @@ -7,26 +7,53 @@ on: branches: [ master ] jobs: - linux: - runs-on: ubuntu-latest - + job: + name: ${{ matrix.os }}-${{ matrix.cxx }}-build-and-test + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + name: [ubuntu-gcc, macos-clang, windows-msvc, ubuntu-clang] + # For Windows msvc, for Linux and macOS let's use the clang compiler, use gcc for Linux. + include: + - name: windows-msvc + os: windows-latest + cxx: cl.exe + cc: cl.exe + - name: ubuntu-clang + os: ubuntu-latest + cxx: clang++ + cc: clang + - name: macos-clang + os: macos-latest + cxx: clang++ + cc: clang + - name: ubuntu-gcc + os: ubuntu-latest + cxx: g++ + cc: gcc + steps: - - uses: actions/checkout@v1 - - name: configure - run: cmake CMakeLists.txt - - name: build - run: cmake --build . - - name: test - run: cd bin && ./unit - - mac: - runs-on: macos-latest + - uses: actions/checkout@v2 - steps: - - uses: actions/checkout@v1 - - name: configure - run: cmake CMakeLists.txt - - name: build - run: cmake --build . + - uses: lukka/get-cmake@latest + + - uses: ilammy/msvc-dev-cmd@v1 + + - uses: lukka/set-shell-env@v1 + with: + CXX: ${{ matrix.cxx }} + CC: ${{ matrix.cc }} + + - name: configure and build + uses: lukka/run-cmake@v2 + with: + cmakeListsOrSettingsJson: CMakeListsTxtAdvanced + cmakeListsTxtPath: '${{ github.workspace }}/CMakeLists.txt' + cmakeAppendedArgs: '-GNinja -DCMAKE_BUILD_TYPE=Release' + buildWithCMakeArgs: '-- -v' + buildDirectory: '${{ github.workspace }}/build/' + - name: test - run: cd bin && ./unit + run: cd build/bin && ./unit + shell: bash diff --git a/CMakeLists.txt b/CMakeLists.txt index ecd131b8c..c631b7685 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -108,10 +108,6 @@ OPTION ( ASSIMP_ERROR_MAX "Enable all warnings." OFF ) -OPTION ( ASSIMP_WERROR - "Treat warnings as errors." - OFF -) OPTION ( ASSIMP_ASAN "Enable AddressSanitizer." OFF @@ -243,14 +239,14 @@ IF( UNIX ) INCLUDE(GNUInstallDirs) ENDIF() -# Grouped compiler settings +# Grouped compiler settings ######################################## IF ((CMAKE_C_COMPILER_ID MATCHES "GNU") AND NOT CMAKE_COMPILER_IS_MINGW) IF(NOT ASSIMP_HUNTER_ENABLED) - SET(CMAKE_CXX_FLAGS "-fPIC -std=c++0x ${CMAKE_CXX_FLAGS}") - SET(CMAKE_C_FLAGS "-fPIC ${CMAKE_C_FLAGS}") + SET(CMAKE_CXX_STANDARD 11) + SET(CMAKE_POSITION_INDEPENDENT_CODE ON) ENDIF() # hide all not-exported symbols - SET(CMAKE_CXX_FLAGS "-g -fvisibility=hidden -fno-strict-aliasing -Wall ${CMAKE_CXX_FLAGS}") + SET(CMAKE_CXX_FLAGS "-fvisibility=hidden -fno-strict-aliasing -Wall ${CMAKE_CXX_FLAGS}") SET(CMAKE_C_FLAGS "-fno-strict-aliasing ${CMAKE_C_FLAGS}") SET(LIBSTDC++_LIBRARIES -lstdc++) ELSEIF(MSVC) @@ -263,10 +259,10 @@ ELSEIF(MSVC) SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /D_DEBUG /Zi /Od") ELSEIF ( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" ) IF(NOT ASSIMP_HUNTER_ENABLED) - SET(CMAKE_CXX_FLAGS "-fPIC -std=c++11 ${CMAKE_CXX_FLAGS}") - SET(CMAKE_C_FLAGS "-fPIC ${CMAKE_C_FLAGS}") + SET(CMAKE_CXX_STANDARD 11) + SET(CMAKE_POSITION_INDEPENDENT_CODE ON) ENDIF() - SET(CMAKE_CXX_FLAGS "-g -fvisibility=hidden -fno-strict-aliasing -Wall -Wno-long-long ${CMAKE_CXX_FLAGS}" ) + SET(CMAKE_CXX_FLAGS "-fvisibility=hidden -fno-strict-aliasing -Wall -Wno-long-long ${CMAKE_CXX_FLAGS}" ) SET(CMAKE_C_FLAGS "-fno-strict-aliasing ${CMAKE_C_FLAGS}") ELSEIF( CMAKE_COMPILER_IS_MINGW ) IF (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0) @@ -311,16 +307,6 @@ IF (ASSIMP_ERROR_MAX) ENDIF() ENDIF() -IF (ASSIMP_WERROR) - MESSAGE(STATUS "Treating warnings as errors") - IF (MSVC) - ADD_COMPILE_OPTIONS(/WX) - ELSE() - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror") - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror") - ENDIF() -ENDIF() - IF (ASSIMP_ASAN) MESSAGE(STATUS "AddressSanitizer enabled") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address") @@ -350,14 +336,6 @@ ELSE() SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin") ENDIF () -# Cache these to allow the user to override them manually. -SET( ASSIMP_LIB_INSTALL_DIR "lib" CACHE STRING - "Path the built library files are installed to." ) -SET( ASSIMP_INCLUDE_INSTALL_DIR "include" CACHE STRING - "Path the header files are installed to." ) -SET( ASSIMP_BIN_INSTALL_DIR "bin" CACHE STRING - "Path the tool executables are installed to." ) - get_cmake_property(is_multi_config GENERATOR_IS_MULTI_CONFIG) IF (ASSIMP_INJECT_DEBUG_POSTFIX AND (is_multi_config OR CMAKE_BUILD_TYPE STREQUAL "Debug")) @@ -417,6 +395,28 @@ ELSE() else() set(BUILD_LIB_TYPE STATIC) endif() + + IF( UNIX ) + # Use GNUInstallDirs for Unix predefined directories + INCLUDE(GNUInstallDirs) + + SET( ASSIMP_LIB_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR}) + SET( ASSIMP_INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR}) + SET( ASSIMP_BIN_INSTALL_DIR ${CMAKE_INSTALL_BINDIR}) + ELSE() + # Cache these to allow the user to override them on non-Unix platforms + SET( ASSIMP_LIB_INSTALL_DIR "lib" CACHE STRING + "Path the built library files are installed to." ) + SET( ASSIMP_INCLUDE_INSTALL_DIR "include" CACHE STRING + "Path the header files are installed to." ) + SET( ASSIMP_BIN_INSTALL_DIR "bin" CACHE STRING + "Path the tool executables are installed to." ) + + SET(CMAKE_INSTALL_FULL_INCLUDEDIR ${CMAKE_INSTALL_PREFIX}/${ASSIMP_INCLUDE_INSTALL_DIR}) + SET(CMAKE_INSTALL_FULL_LIBDIR ${CMAKE_INSTALL_PREFIX}/${ASSIMP_LIB_INSTALL_DIR}) + SET(CMAKE_INSTALL_FULL_BINDIR ${CMAKE_INSTALL_PREFIX}/${ASSIMP_BIN_INSTALL_DIR}) + ENDIF() + CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/assimp-config.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/assimp-config.cmake" @ONLY IMMEDIATE) CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/assimpTargets.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/assimpTargets.cmake" @ONLY IMMEDIATE) IF (is_multi_config) diff --git a/assimp.pc.in b/assimp.pc.in index 02cf59dc4..555a3a1d3 100644 --- a/assimp.pc.in +++ b/assimp.pc.in @@ -1,7 +1,5 @@ -prefix=@CMAKE_INSTALL_PREFIX@ -exec_prefix=@CMAKE_INSTALL_PREFIX@/ -libdir=@CMAKE_INSTALL_PREFIX@/@ASSIMP_LIB_INSTALL_DIR@ -includedir=@CMAKE_INSTALL_PREFIX@/@ASSIMP_INCLUDE_INSTALL_DIR@ +libdir=@CMAKE_INSTALL_FULL_LIBDIR@ +includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ Name: @CMAKE_PROJECT_NAME@ Description: Import various well-known 3D model formats in an uniform manner. diff --git a/assimpTargets-debug.cmake.in b/assimpTargets-debug.cmake.in index 4cb917fd8..de6459eaf 100644 --- a/assimpTargets-debug.cmake.in +++ b/assimpTargets-debug.cmake.in @@ -7,6 +7,8 @@ set(CMAKE_IMPORT_FILE_VERSION 1) set(ASSIMP_BUILD_SHARED_LIBS @BUILD_SHARED_LIBS@) +get_property(LIB64 GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS) + if(MSVC) if(MSVC_TOOLSET_VERSION) set(MSVC_PREFIX "vc${MSVC_TOOLSET_VERSION}") @@ -35,8 +37,6 @@ if(MSVC) endif() set(ASSIMP_LIBRARY_SUFFIX "@ASSIMP_LIBRARY_SUFFIX@-${MSVC_PREFIX}-mt" CACHE STRING "the suffix for the assimp windows library" ) - file(TO_NATIVE_PATH "${_IMPORT_PREFIX}" _IMPORT_PREFIX) - if(ASSIMP_BUILD_SHARED_LIBS) set(sharedLibraryName "assimp${ASSIMP_LIBRARY_SUFFIX}@CMAKE_DEBUG_POSTFIX@@CMAKE_SHARED_LIBRARY_SUFFIX@") set(importLibraryName "assimp${ASSIMP_LIBRARY_SUFFIX}@CMAKE_DEBUG_POSTFIX@@CMAKE_IMPORT_LIBRARY_SUFFIX@") @@ -44,22 +44,22 @@ if(MSVC) # Import target "assimp::assimp" for configuration "Debug" set_property(TARGET assimp::assimp APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG) set_target_properties(assimp::assimp PROPERTIES - IMPORTED_IMPLIB_DEBUG "${_IMPORT_PREFIX}/lib/${importLibraryName}" - IMPORTED_LOCATION_DEBUG "${_IMPORT_PREFIX}/bin/${sharedLibraryName}" + IMPORTED_IMPLIB_DEBUG "@CMAKE_INSTALL_FULL_LIBDIR@/${importLibraryName}" + IMPORTED_LOCATION_DEBUG "@CMAKE_INSTALL_FULL_BINDIR@/${sharedLibraryName}" ) list(APPEND _IMPORT_CHECK_TARGETS assimp::assimp ) - list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "${_IMPORT_PREFIX}/lib/${importLibraryName}") - list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "${_IMPORT_PREFIX}/bin/${sharedLibraryName}" ) + list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "@CMAKE_INSTALL_FULL_LIBDIR@/${importLibraryName}") + list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "@CMAKE_INSTALL_FULL_BINDIR@/${sharedLibraryName}" ) else() set(staticLibraryName "assimp${ASSIMP_LIBRARY_SUFFIX}@CMAKE_DEBUG_POSTFIX@@CMAKE_STATIC_LIBRARY_SUFFIX@") # Import target "assimp::assimp" for configuration "Debug" set_property(TARGET assimp::assimp APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG) set_target_properties(assimp::assimp PROPERTIES - IMPORTED_LOCATION_DEBUG "${_IMPORT_PREFIX}/lib/${staticLibraryName}" + IMPORTED_LOCATION_DEBUG "@CMAKE_INSTALL_FULL_LIBDIR@/${staticLibraryName}" ) list(APPEND _IMPORT_CHECK_TARGETS assimp::assimp ) - list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "${_IMPORT_PREFIX}/lib/${staticLibraryName}") + list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "@CMAKE_INSTALL_FULL_LIBDIR@/${staticLibraryName}") endif() else() @@ -75,23 +75,20 @@ else() endif() set_target_properties(assimp::assimp PROPERTIES IMPORTED_SONAME_DEBUG "${sharedLibraryName}" - IMPORTED_LOCATION_DEBUG "${_IMPORT_PREFIX}/lib/${sharedLibraryName}" + IMPORTED_LOCATION_DEBUG "@CMAKE_INSTALL_FULL_LIBDIR@/${sharedLibraryName}" ) list(APPEND _IMPORT_CHECK_TARGETS assimp::assimp ) - list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "${_IMPORT_PREFIX}/lib/${sharedLibraryName}" ) + list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "@CMAKE_INSTALL_FULL_LIBDIR@/${sharedLibraryName}" ) else() set(staticLibraryName "libassimp${ASSIMP_LIBRARY_SUFFIX}@CMAKE_DEBUG_POSTFIX@@CMAKE_STATIC_LIBRARY_SUFFIX@") set_target_properties(assimp::assimp PROPERTIES - IMPORTED_LOCATION_DEBUG "${_IMPORT_PREFIX}/lib/${staticLibraryName}" + IMPORTED_LOCATION_DEBUG "@CMAKE_INSTALL_FULL_LIBDIR@/${staticLibraryName}" ) list(APPEND _IMPORT_CHECK_TARGETS assimp::assimp ) - list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "${_IMPORT_PREFIX}/lib/${staticLibraryName}" ) + list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "@CMAKE_INSTALL_FULL_LIBDIR@/${staticLibraryName}" ) endif() endif() - - - # Commands beyond this point should not need to know the version. set(CMAKE_IMPORT_FILE_VERSION) diff --git a/assimpTargets-release.cmake.in b/assimpTargets-release.cmake.in index 702109305..6a5bafcf7 100644 --- a/assimpTargets-release.cmake.in +++ b/assimpTargets-release.cmake.in @@ -7,6 +7,8 @@ set(CMAKE_IMPORT_FILE_VERSION 1) set(ASSIMP_BUILD_SHARED_LIBS @BUILD_SHARED_LIBS@) +get_property(LIB64 GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS) + if(MSVC) if(MSVC_TOOLSET_VERSION) set(MSVC_PREFIX "vc${MSVC_TOOLSET_VERSION}") @@ -34,8 +36,6 @@ if(MSVC) endif() endif() set(ASSIMP_LIBRARY_SUFFIX "@ASSIMP_LIBRARY_SUFFIX@-${MSVC_PREFIX}-mt" CACHE STRING "the suffix for the assimp windows library" ) - - file(TO_NATIVE_PATH "${_IMPORT_PREFIX}" _IMPORT_PREFIX) if(ASSIMP_BUILD_SHARED_LIBS) set(sharedLibraryName "assimp${ASSIMP_LIBRARY_SUFFIX}@CMAKE_SHARED_LIBRARY_SUFFIX@") @@ -44,22 +44,22 @@ if(MSVC) # Import target "assimp::assimp" for configuration "Release" set_property(TARGET assimp::assimp APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE) set_target_properties(assimp::assimp PROPERTIES - IMPORTED_IMPLIB_RELEASE "${_IMPORT_PREFIX}/lib/${importLibraryName}" - IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/bin/${sharedLibraryName}" + IMPORTED_IMPLIB_RELEASE "@CMAKE_INSTALL_FULL_LIBDIR@/${importLibraryName}" + IMPORTED_LOCATION_RELEASE "@CMAKE_INSTALL_FULL_BINDIR@/${sharedLibraryName}" ) list(APPEND _IMPORT_CHECK_TARGETS assimp::assimp ) - list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "${_IMPORT_PREFIX}/lib/${importLibraryName}") - list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "${_IMPORT_PREFIX}/bin/${sharedLibraryName}" ) + list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "@CMAKE_INSTALL_FULL_LIBDIR@/${importLibraryName}") + list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "@CMAKE_INSTALL_FULL_BINDIR@/${sharedLibraryName}" ) else() set(staticLibraryName "assimp${ASSIMP_LIBRARY_SUFFIX}@CMAKE_STATIC_LIBRARY_SUFFIX@") # Import target "assimp::assimp" for configuration "Release" set_property(TARGET assimp::assimp APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE) set_target_properties(assimp::assimp PROPERTIES - IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/lib/${staticLibraryName}" + IMPORTED_LOCATION_RELEASE "@CMAKE_INSTALL_FULL_LIBDIR@/${staticLibraryName}" ) list(APPEND _IMPORT_CHECK_TARGETS assimp::assimp ) - list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "${_IMPORT_PREFIX}/lib/${staticLibraryName}") + list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "@CMAKE_INSTALL_FULL_LIBDIR@/${staticLibraryName}") endif() else() @@ -75,18 +75,17 @@ else() endif() set_target_properties(assimp::assimp PROPERTIES IMPORTED_SONAME_RELEASE "${sharedLibraryName}" - - IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/lib/${sharedLibraryName}" + IMPORTED_LOCATION_RELEASE "@CMAKE_INSTALL_FULL_LIBDIR@/${sharedLibraryName}" ) list(APPEND _IMPORT_CHECK_TARGETS assimp::assimp ) - list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "${_IMPORT_PREFIX}/lib/${sharedLibraryName}" ) + list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "@CMAKE_INSTALL_FULL_LIBDIR@/${sharedLibraryName}" ) else() set(staticLibraryName "libassimp${ASSIMP_LIBRARY_SUFFIX}@CMAKE_STATIC_LIBRARY_SUFFIX@") set_target_properties(assimp::assimp PROPERTIES - IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/lib/${staticLibraryName}" + IMPORTED_LOCATION_RELEASE "@CMAKE_INSTALL_FULL_LIBDIR@/${staticLibraryName}" ) list(APPEND _IMPORT_CHECK_TARGETS assimp::assimp ) - list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "${_IMPORT_PREFIX}/lib/${staticLibraryName}" ) + list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "@CMAKE_INSTALL_FULL_LIBDIR@/${staticLibraryName}" ) endif() endif() diff --git a/assimpTargets.cmake.in b/assimpTargets.cmake.in index b1c618c3a..897d00217 100644 --- a/assimpTargets.cmake.in +++ b/assimpTargets.cmake.in @@ -43,23 +43,13 @@ unset(_targetsDefined) unset(_targetsNotDefined) unset(_expectedTargets) - -# Compute the installation prefix relative to this file. -get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH) -get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) -get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) -get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) -if(_IMPORT_PREFIX STREQUAL "/") - set(_IMPORT_PREFIX "") -endif() - # Create imported target assimp::assimp add_library(assimp::assimp @BUILD_LIB_TYPE@ IMPORTED) set_target_properties(assimp::assimp PROPERTIES COMPATIBLE_INTERFACE_STRING "assimp_MAJOR_VERSION" INTERFACE_assimp_MAJOR_VERSION "1" - INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include;${_IMPORT_PREFIX}/include" + INTERFACE_INCLUDE_DIRECTORIES "@CMAKE_INSTALL_FULL_INCLUDEDIR@" #INTERFACE_LINK_LIBRARIES "TxtUtils::TxtUtils;MealyMachine::MealyMachine" ) @@ -74,9 +64,6 @@ foreach(f ${CONFIG_FILES}) include(${f}) endforeach() -# Cleanup temporary variables. -set(_IMPORT_PREFIX) - # Loop over all imported files and verify that they actually exist foreach(target ${_IMPORT_CHECK_TARGETS} ) foreach(file ${_IMPORT_CHECK_FILES_FOR_${target}} ) diff --git a/code/3DS/3DSConverter.cpp b/code/3DS/3DSConverter.cpp index 3f0e20bb0..8c8a8200a 100644 --- a/code/3DS/3DSConverter.cpp +++ b/code/3DS/3DSConverter.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2020, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -43,7 +41,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @file Implementation of the 3ds importer class */ - #ifndef ASSIMP_BUILD_NO_3DS_IMPORTER // internal headers diff --git a/code/3DS/3DSHelper.h b/code/3DS/3DSHelper.h index 633cfbbf0..e348c090d 100644 --- a/code/3DS/3DSHelper.h +++ b/code/3DS/3DSHelper.h @@ -322,7 +322,7 @@ struct Face : public FaceWithSmoothingGroup { }; #ifdef _WIN32 -# pragma warning(disable : 4315) +#pragma warning(disable : 4315) #endif // --------------------------------------------------------------------------- @@ -441,30 +441,52 @@ struct Material { // empty } - Material(const Material &other) = default; - Material &operator=(const Material &other) = default; + Material(const Material &other) : + mName(other.mName), + mDiffuse(other.mDiffuse), + mSpecularExponent(other.mSpecularExponent), + mShininessStrength(other.mShininessStrength), + mSpecular(other.mSpecular), + mAmbient(other.mAmbient), + mShading(other.mShading), + mTransparency(other.mTransparency), + sTexDiffuse(other.sTexDiffuse), + sTexOpacity(other.sTexOpacity), + sTexSpecular(other.sTexSpecular), + sTexReflective(other.sTexReflective), + sTexBump(other.sTexBump), + sTexEmissive(other.sTexEmissive), + sTexShininess(other.sTexShininess), + mBumpHeight(other.mBumpHeight), + mEmissive(other.mEmissive), + sTexAmbient(other.sTexAmbient), + mTwoSided(other.mTwoSided) { + // empty + + } //! Move constructor. This is explicitly written because MSVC doesn't support defaulting it - Material(Material &&other) AI_NO_EXCEPT - : mName(std::move(other.mName)), - mDiffuse(std::move(other.mDiffuse)), - mSpecularExponent(std::move(other.mSpecularExponent)), - mShininessStrength(std::move(other.mShininessStrength)), - mSpecular(std::move(other.mSpecular)), - mAmbient(std::move(other.mAmbient)), - mShading(std::move(other.mShading)), - mTransparency(std::move(other.mTransparency)), - sTexDiffuse(std::move(other.sTexDiffuse)), - sTexOpacity(std::move(other.sTexOpacity)), - sTexSpecular(std::move(other.sTexSpecular)), - sTexReflective(std::move(other.sTexReflective)), - sTexBump(std::move(other.sTexBump)), - sTexEmissive(std::move(other.sTexEmissive)), - sTexShininess(std::move(other.sTexShininess)), - mBumpHeight(std::move(other.mBumpHeight)), - mEmissive(std::move(other.mEmissive)), - sTexAmbient(std::move(other.sTexAmbient)), - mTwoSided(std::move(other.mTwoSided)) { + Material(Material &&other) AI_NO_EXCEPT : + mName(std::move(other.mName)), + mDiffuse(std::move(other.mDiffuse)), + mSpecularExponent(std::move(other.mSpecularExponent)), + mShininessStrength(std::move(other.mShininessStrength)), + mSpecular(std::move(other.mSpecular)), + mAmbient(std::move(other.mAmbient)), + mShading(std::move(other.mShading)), + mTransparency(std::move(other.mTransparency)), + sTexDiffuse(std::move(other.sTexDiffuse)), + sTexOpacity(std::move(other.sTexOpacity)), + sTexSpecular(std::move(other.sTexSpecular)), + sTexReflective(std::move(other.sTexReflective)), + sTexBump(std::move(other.sTexBump)), + sTexEmissive(std::move(other.sTexEmissive)), + sTexShininess(std::move(other.sTexShininess)), + mBumpHeight(std::move(other.mBumpHeight)), + mEmissive(std::move(other.mEmissive)), + sTexAmbient(std::move(other.sTexAmbient)), + mTwoSided(std::move(other.mTwoSided)) { + // empty } Material &operator=(Material &&other) AI_NO_EXCEPT { diff --git a/code/3DS/3DSLoader.cpp b/code/3DS/3DSLoader.cpp index 0b4a93a2b..13cef3a39 100644 --- a/code/3DS/3DSLoader.cpp +++ b/code/3DS/3DSLoader.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2020, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -72,7 +70,6 @@ static const aiImporterDesc desc = { "3ds prj" }; - // ------------------------------------------------------------------------------------------------ // Begins a new parsing block // - Reads the current chunk and validates it @@ -141,15 +138,13 @@ bool Discreet3DSImporter::CanRead( const std::string& pFile, IOSystem* pIOHandle // ------------------------------------------------------------------------------------------------ // Loader registry entry -const aiImporterDesc* Discreet3DSImporter::GetInfo () const -{ +const aiImporterDesc* Discreet3DSImporter::GetInfo () const { return &desc; } // ------------------------------------------------------------------------------------------------ // Setup configuration properties -void Discreet3DSImporter::SetupProperties(const Importer* /*pImp*/) -{ +void Discreet3DSImporter::SetupProperties(const Importer* /*pImp*/) { // nothing to be done for the moment } @@ -200,7 +195,7 @@ void Discreet3DSImporter::InternReadFile( const std::string& pFile, ComputeNormalsWithSmoothingsGroups(mesh); } - // Replace all occurences of the default material with a + // Replace all occurrences of the default material with a // valid material. Generate it if no material containing // DEFAULT in its name has been found in the file ReplaceDefaultMaterial(); @@ -227,8 +222,7 @@ void Discreet3DSImporter::InternReadFile( const std::string& pFile, // ------------------------------------------------------------------------------------------------ // Applies a master-scaling factor to the imported scene -void Discreet3DSImporter::ApplyMasterScale(aiScene* pScene) -{ +void Discreet3DSImporter::ApplyMasterScale(aiScene* pScene) { // There are some 3DS files with a zero scaling factor if (!mMasterScale)mMasterScale = 1.0f; else mMasterScale = 1.0f / mMasterScale; @@ -1084,7 +1078,7 @@ void Discreet3DSImporter::ParseMeshChunk() mMesh.mFaceMaterials.resize(mMesh.mFaces.size(),0xcdcdcdcd); // Larger 3DS files could have multiple FACE chunks here - chunkSize = stream->GetRemainingSizeToLimit(); + chunkSize = (int)stream->GetRemainingSizeToLimit(); if ( chunkSize > (int) sizeof(Discreet3DS::Chunk ) ) ParseFaceChunk(); } diff --git a/code/3DS/3DSLoader.h b/code/3DS/3DSLoader.h index 9181294b3..68a48e7a2 100644 --- a/code/3DS/3DSLoader.h +++ b/code/3DS/3DSLoader.h @@ -65,15 +65,11 @@ using namespace D3DS; // --------------------------------------------------------------------------------- /** Importer class for 3D Studio r3 and r4 3DS files */ -class Discreet3DSImporter : public BaseImporter -{ +class Discreet3DSImporter : public BaseImporter { public: - Discreet3DSImporter(); ~Discreet3DSImporter(); -public: - // ------------------------------------------------------------------- /** Returns whether the class can handle the format of the given file. * See BaseImporter::CanRead() for details. diff --git a/code/3MF/D3MFExporter.cpp b/code/3MF/D3MFExporter.cpp index 092b947e9..83036b236 100644 --- a/code/3MF/D3MFExporter.cpp +++ b/code/3MF/D3MFExporter.cpp @@ -181,7 +181,7 @@ bool D3MFExporter::export3DModel() { writeHeader(); mModelOutput << "<" << XmlTag::model << " " << XmlTag::model_unit << "=\"millimeter\"" - << "xmlns=\"http://schemas.microsoft.com/3dmanufacturing/core/2015/02\">" + << " xmlns=\"http://schemas.microsoft.com/3dmanufacturing/core/2015/02\">" << std::endl; mModelOutput << "<" << XmlTag::resources << ">"; mModelOutput << std::endl; @@ -212,7 +212,7 @@ bool D3MFExporter::export3DModel() { } void D3MFExporter::writeHeader() { - mModelOutput << ""; + mModelOutput << ""; mModelOutput << std::endl; } @@ -254,16 +254,28 @@ void D3MFExporter::writeBaseMaterials() { if ( mat->Get( AI_MATKEY_COLOR_DIFFUSE, color ) == aiReturn_SUCCESS ) { hexDiffuseColor.clear(); tmp.clear(); - hexDiffuseColor = "#"; - - tmp = DecimalToHexa( (ai_real) color.r ); - hexDiffuseColor += tmp; - tmp = DecimalToHexa((ai_real)color.g); - hexDiffuseColor += tmp; - tmp = DecimalToHexa((ai_real)color.b); - hexDiffuseColor += tmp; - tmp = DecimalToHexa((ai_real)color.a); - hexDiffuseColor += tmp; + // rgbs % + if(color.r <= 1 && color.g <= 1 && color.b <= 1 && color.a <= 1){ + + hexDiffuseColor = Rgba2Hex( + (int)((ai_real)color.r)*255, + (int)((ai_real)color.g)*255, + (int)((ai_real)color.b)*255, + (int)((ai_real)color.a)*255, + true + ); + + }else{ + hexDiffuseColor = "#"; + tmp = DecimalToHexa( (ai_real) color.r ); + hexDiffuseColor += tmp; + tmp = DecimalToHexa((ai_real)color.g); + hexDiffuseColor += tmp; + tmp = DecimalToHexa((ai_real)color.b); + hexDiffuseColor += tmp; + tmp = DecimalToHexa((ai_real)color.a); + hexDiffuseColor += tmp; + } } else { hexDiffuseColor = "#FFFFFFFF"; } @@ -284,7 +296,7 @@ void D3MFExporter::writeObjects() { if ( nullptr == currentNode ) { continue; } - mModelOutput << "<" << XmlTag::object << " id=\"" << currentNode->mName.C_Str() << "\" type=\"model\">"; + mModelOutput << "<" << XmlTag::object << " id=\"" << i + 2 << "\" type=\"model\">"; mModelOutput << std::endl; for ( unsigned int j = 0; j < currentNode->mNumMeshes; ++j ) { aiMesh *currentMesh = mScene->mMeshes[ currentNode->mMeshes[ j ] ]; @@ -348,7 +360,7 @@ void D3MFExporter::writeBuild() { mModelOutput << "<" << XmlTag::build << ">" << std::endl; for ( size_t i = 0; i < mBuildItems.size(); ++i ) { - mModelOutput << "<" << XmlTag::item << " objectid=\"" << i + 1 << "\"/>"; + mModelOutput << "<" << XmlTag::item << " objectid=\"" << i + 2 << "\"/>"; mModelOutput << std::endl; } mModelOutput << ""; diff --git a/code/ASE/ASEParser.cpp b/code/ASE/ASEParser.cpp index efc6ecd0d..72e8b3373 100644 --- a/code/ASE/ASEParser.cpp +++ b/code/ASE/ASEParser.cpp @@ -142,11 +142,11 @@ void Parser::LogWarning(const char* szWarn) { ai_assert(NULL != szWarn); - char szTemp[1024]; + char szTemp[2048]; #if _MSC_VER >= 1400 sprintf_s(szTemp, "Line %u: %s",iLineNumber,szWarn); #else - ai_snprintf(szTemp,1024,"Line %u: %s",iLineNumber,szWarn); + ai_snprintf(szTemp,sizeof(szTemp),"Line %u: %s",iLineNumber,szWarn); #endif // output the warning to the logger ... diff --git a/code/Assjson/cencode.c b/code/Assjson/cencode.c index bd302100b..0ed979b01 100644 --- a/code/Assjson/cencode.c +++ b/code/Assjson/cencode.c @@ -9,6 +9,9 @@ For details, see http://sourceforge.net/projects/libb64 const int CHARS_PER_LINE = 72; +#pragma warning(push) +#pragma warning(disable : 4244) + void base64_init_encodestate(base64_encodestate* state_in) { state_in->step = step_A; @@ -107,3 +110,4 @@ int base64_encode_blockend(char* code_out, base64_encodestate* state_in) return (int)(codechar - code_out); } +#pragma warning(pop) diff --git a/code/Assxml/AssxmlExporter.cpp b/code/Assxml/AssxmlExporter.cpp index 720fd5b40..ac2a433dd 100644 --- a/code/Assxml/AssxmlExporter.cpp +++ b/code/Assxml/AssxmlExporter.cpp @@ -50,7 +50,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -namespace Assimp { +namespace Assimp { void ExportSceneAssxml(const char* pFile, IOSystem* pIOSystem, const aiScene* pScene, const ExportProperties* /*pProperties*/) { diff --git a/code/Blender/BlenderBMesh.cpp b/code/Blender/BlenderBMesh.cpp index 039302e12..937d9d073 100644 --- a/code/Blender/BlenderBMesh.cpp +++ b/code/Blender/BlenderBMesh.cpp @@ -42,7 +42,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * @brief Conversion of Blender's new BMesh stuff */ - #ifndef ASSIMP_BUILD_NO_BLEND_IMPORTER #include "BlenderDNA.h" @@ -181,6 +180,7 @@ void BlenderBMeshConverter::AddFace( int v1, int v2, int v3, int v4 ) face.v2 = v2; face.v3 = v3; face.v4 = v4; + face.flag = 0; // TODO - Work out how materials work face.mat_nr = 0; triMesh->mface.push_back( face ); diff --git a/code/Blender/BlenderLoader.cpp b/code/Blender/BlenderLoader.cpp index b4e07617a..06ae79cd2 100644 --- a/code/Blender/BlenderLoader.cpp +++ b/code/Blender/BlenderLoader.cpp @@ -206,7 +206,7 @@ void BlenderImporter::InternReadFile( const std::string& pFile, inflateInit2(&zstream, 16+MAX_WBITS); zstream.next_in = reinterpret_cast( reader->GetPtr() ); - zstream.avail_in = reader->GetRemainingSize(); + zstream.avail_in = (uInt) reader->GetRemainingSize(); size_t total = 0l; diff --git a/code/CApi/AssimpCExport.cpp b/code/CApi/AssimpCExport.cpp index 137cc2894..a6e7a304f 100644 --- a/code/CApi/AssimpCExport.cpp +++ b/code/CApi/AssimpCExport.cpp @@ -73,11 +73,11 @@ ASSIMP_API const aiExportFormatDesc* aiGetExportFormatDescription( size_t index) aiExportFormatDesc *desc = new aiExportFormatDesc; desc->description = new char[ strlen( orig->description ) + 1 ](); - ::strncpy( (char*) desc->description, orig->description, strlen( orig->description ) ); + ::memcpy( (char*) desc->description, orig->description, strlen( orig->description ) ); desc->fileExtension = new char[ strlen( orig->fileExtension ) + 1 ](); - ::strncpy( ( char* ) desc->fileExtension, orig->fileExtension, strlen( orig->fileExtension ) ); + ::memcpy( ( char* ) desc->fileExtension, orig->fileExtension, strlen( orig->fileExtension ) ); desc->id = new char[ strlen( orig->id ) + 1 ](); - ::strncpy( ( char* ) desc->id, orig->id, strlen( orig->id ) ); + ::memcpy( ( char* ) desc->id, orig->id, strlen( orig->id ) ); return desc; } diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index c872e7b20..6afed40f9 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -121,6 +121,7 @@ SET( PUBLIC_HEADERS ${HEADER_PATH}/GenericProperty.h ${HEADER_PATH}/SpatialSort.h ${HEADER_PATH}/SkeletonMeshBuilder.h + ${HEADER_PATH}/SmallVector.h ${HEADER_PATH}/SmoothingGroups.h ${HEADER_PATH}/SmoothingGroups.inl ${HEADER_PATH}/StandardShapes.h @@ -1133,6 +1134,13 @@ ENDIF () ADD_LIBRARY( assimp ${assimp_src} ) ADD_LIBRARY(assimp::assimp ALIAS assimp) +# enable warnings as errors ######################################## +IF (MSVC) + TARGET_COMPILE_OPTIONS(assimp PRIVATE /WX) +ELSE() + TARGET_COMPILE_OPTIONS(assimp PRIVATE -Werror) +ENDIF() + TARGET_INCLUDE_DIRECTORIES ( assimp PUBLIC $ $ diff --git a/code/CSM/CSMLoader.cpp b/code/CSM/CSMLoader.cpp index fbabea12e..914ca4e33 100644 --- a/code/CSM/CSMLoader.cpp +++ b/code/CSM/CSMLoader.cpp @@ -178,7 +178,7 @@ void CSMImporter::InternReadFile( const std::string& pFile, *ot++ = *buffer++; *ot = '\0'; - nda->mNodeName.length = (ai_uint32)(ot-nda->mNodeName.data); + nda->mNodeName.length = static_cast(ot-nda->mNodeName.data); } anim->mNumChannels = static_cast(anims_temp.size()); diff --git a/code/Common/Assimp.cpp b/code/Common/Assimp.cpp index 7dae2633c..67f1c3af2 100644 --- a/code/Common/Assimp.cpp +++ b/code/Common/Assimp.cpp @@ -44,15 +44,15 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * @brief Implementation of the Plain-C API */ +#include +#include +#include #include -#include -#include -#include #include #include -#include -#include -#include +#include +#include +#include #include "CApi/CInterfaceIOWrapper.h" #include "Importer.h" @@ -62,46 +62,45 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // ------------------------------------------------------------------------------------------------ #ifndef ASSIMP_BUILD_SINGLETHREADED -# include -# include +#include +#include #endif // ------------------------------------------------------------------------------------------------ using namespace Assimp; namespace Assimp { - // underlying structure for aiPropertyStore - typedef BatchLoader::PropertyMap PropertyMap; +// underlying structure for aiPropertyStore +typedef BatchLoader::PropertyMap PropertyMap; - /** Stores the LogStream objects for all active C log streams */ - struct mpred { - bool operator () (const aiLogStream& s0, const aiLogStream& s1) const { - return s0.callback LogStreamMap; +/** Stores the LogStream objects for all active C log streams */ +struct mpred { + bool operator()(const aiLogStream &s0, const aiLogStream &s1) const { + return s0.callback < s1.callback && s0.user < s1.user; + } +}; +typedef std::map LogStreamMap; - /** Stores the LogStream objects allocated by #aiGetPredefinedLogStream */ - typedef std::list PredefLogStreamMap; +/** Stores the LogStream objects allocated by #aiGetPredefinedLogStream */ +typedef std::list PredefLogStreamMap; - /** Local storage of all active log streams */ - static LogStreamMap gActiveLogStreams; +/** Local storage of all active log streams */ +static LogStreamMap gActiveLogStreams; - /** Local storage of LogStreams allocated by #aiGetPredefinedLogStream */ - static PredefLogStreamMap gPredefinedStreams; +/** Local storage of LogStreams allocated by #aiGetPredefinedLogStream */ +static PredefLogStreamMap gPredefinedStreams; - /** Error message of the last failed import process */ - static std::string gLastErrorString; +/** Error message of the last failed import process */ +static std::string gLastErrorString; - /** Verbose logging active or not? */ - static aiBool gVerboseLogging = false; +/** Verbose logging active or not? */ +static aiBool gVerboseLogging = false; - /** will return all registered importers. */ - void GetImporterInstanceList(std::vector< BaseImporter* >& out); - - /** will delete all registered importers. */ - void DeleteImporterInstanceList(std::vector< BaseImporter* >& out); -} // namespace assimp +/** will return all registered importers. */ +void GetImporterInstanceList(std::vector &out); +/** will delete all registered importers. */ +void DeleteImporterInstanceList(std::vector &out); +} // namespace Assimp #ifndef ASSIMP_BUILD_SINGLETHREADED /** Global mutex to manage the access to the log-stream map */ @@ -112,12 +111,12 @@ static std::mutex gLogStreamMutex; // Custom LogStream implementation for the C-API class LogToCallbackRedirector : public LogStream { public: - explicit LogToCallbackRedirector(const aiLogStream& s) - : stream (s) { + explicit LogToCallbackRedirector(const aiLogStream &s) : + stream(s) { ai_assert(NULL != s.callback); } - ~LogToCallbackRedirector() { + ~LogToCallbackRedirector() { #ifndef ASSIMP_BUILD_SINGLETHREADED std::lock_guard lock(gLogStreamMutex); #endif @@ -127,7 +126,7 @@ public: // might cause strange problems, but the chance is quite low. PredefLogStreamMap::iterator it = std::find(gPredefinedStreams.begin(), - gPredefinedStreams.end(), (Assimp::LogStream*)stream.user); + gPredefinedStreams.end(), (Assimp::LogStream *)stream.user); if (it != gPredefinedStreams.end()) { delete *it; @@ -136,8 +135,8 @@ public: } /** @copydoc LogStream::write */ - void write(const char* message) { - stream.callback(message,stream.user); + void write(const char *message) { + stream.callback(message, stream.user); } private: @@ -147,37 +146,37 @@ private: // ------------------------------------------------------------------------------------------------ void ReportSceneNotFoundError() { ASSIMP_LOG_ERROR("Unable to find the Assimp::Importer for this aiScene. " - "The C-API does not accept scenes produced by the C++ API and vice versa"); + "The C-API does not accept scenes produced by the C++ API and vice versa"); ai_assert(false); } // ------------------------------------------------------------------------------------------------ // Reads the given file and returns its content. -const aiScene* aiImportFile( const char* pFile, unsigned int pFlags) { - return aiImportFileEx(pFile,pFlags,NULL); +const aiScene *aiImportFile(const char *pFile, unsigned int pFlags) { + return aiImportFileEx(pFile, pFlags, NULL); } // ------------------------------------------------------------------------------------------------ -const aiScene* aiImportFileEx( const char* pFile, unsigned int pFlags, aiFileIO* pFS) { +const aiScene *aiImportFileEx(const char *pFile, unsigned int pFlags, aiFileIO *pFS) { return aiImportFileExWithProperties(pFile, pFlags, pFS, NULL); } // ------------------------------------------------------------------------------------------------ -const aiScene* aiImportFileExWithProperties( const char* pFile, unsigned int pFlags, - aiFileIO* pFS, const aiPropertyStore* props) { +const aiScene *aiImportFileExWithProperties(const char *pFile, unsigned int pFlags, + aiFileIO *pFS, const aiPropertyStore *props) { ai_assert(NULL != pFile); - const aiScene* scene = NULL; + const aiScene *scene = NULL; ASSIMP_BEGIN_EXCEPTION_REGION(); // create an Importer for this file - Assimp::Importer* imp = new Assimp::Importer(); + Assimp::Importer *imp = new Assimp::Importer(); // copy properties - if(props) { - const PropertyMap* pp = reinterpret_cast(props); - ImporterPimpl* pimpl = imp->Pimpl(); + if (props) { + const PropertyMap *pp = reinterpret_cast(props); + ImporterPimpl *pimpl = imp->Pimpl(); pimpl->mIntProperties = pp->ints; pimpl->mFloatProperties = pp->floats; pimpl->mStringProperties = pp->strings; @@ -185,15 +184,15 @@ const aiScene* aiImportFileExWithProperties( const char* pFile, unsigned int pFl } // setup a custom IO system if necessary if (pFS) { - imp->SetIOHandler( new CIOSystemWrapper (pFS) ); + imp->SetIOHandler(new CIOSystemWrapper(pFS)); } // and have it read the file - scene = imp->ReadFile( pFile, pFlags); + scene = imp->ReadFile(pFile, pFlags); // if succeeded, store the importer in the scene and keep it alive - if( scene) { - ScenePrivateData* priv = const_cast( ScenePriv(scene) ); + if (scene) { + ScenePrivateData *priv = const_cast(ScenePriv(scene)); priv->mOrigImporter = imp; } else { // if failed, extract error code and destroy the import @@ -202,42 +201,40 @@ const aiScene* aiImportFileExWithProperties( const char* pFile, unsigned int pFl } // return imported data. If the import failed the pointer is NULL anyways - ASSIMP_END_EXCEPTION_REGION(const aiScene*); - + ASSIMP_END_EXCEPTION_REGION(const aiScene *); + return scene; } // ------------------------------------------------------------------------------------------------ -const aiScene* aiImportFileFromMemory( - const char* pBuffer, - unsigned int pLength, - unsigned int pFlags, - const char* pHint) -{ +const aiScene *aiImportFileFromMemory( + const char *pBuffer, + unsigned int pLength, + unsigned int pFlags, + const char *pHint) { return aiImportFileFromMemoryWithProperties(pBuffer, pLength, pFlags, pHint, NULL); } // ------------------------------------------------------------------------------------------------ -const aiScene* aiImportFileFromMemoryWithProperties( - const char* pBuffer, - unsigned int pLength, - unsigned int pFlags, - const char* pHint, - const aiPropertyStore* props) -{ - ai_assert( NULL != pBuffer ); - ai_assert( 0 != pLength ); +const aiScene *aiImportFileFromMemoryWithProperties( + const char *pBuffer, + unsigned int pLength, + unsigned int pFlags, + const char *pHint, + const aiPropertyStore *props) { + ai_assert(NULL != pBuffer); + ai_assert(0 != pLength); - const aiScene* scene = NULL; + const aiScene *scene = NULL; ASSIMP_BEGIN_EXCEPTION_REGION(); // create an Importer for this file - Assimp::Importer* imp = new Assimp::Importer(); + Assimp::Importer *imp = new Assimp::Importer(); // copy properties - if(props) { - const PropertyMap* pp = reinterpret_cast(props); - ImporterPimpl* pimpl = imp->Pimpl(); + if (props) { + const PropertyMap *pp = reinterpret_cast(props); + ImporterPimpl *pimpl = imp->Pimpl(); pimpl->mIntProperties = pp->ints; pimpl->mFloatProperties = pp->floats; pimpl->mStringProperties = pp->strings; @@ -245,27 +242,25 @@ const aiScene* aiImportFileFromMemoryWithProperties( } // and have it read the file from the memory buffer - scene = imp->ReadFileFromMemory( pBuffer, pLength, pFlags,pHint); + scene = imp->ReadFileFromMemory(pBuffer, pLength, pFlags, pHint); // if succeeded, store the importer in the scene and keep it alive - if( scene) { - ScenePrivateData* priv = const_cast( ScenePriv(scene) ); - priv->mOrigImporter = imp; - } - else { + if (scene) { + ScenePrivateData *priv = const_cast(ScenePriv(scene)); + priv->mOrigImporter = imp; + } else { // if failed, extract error code and destroy the import gLastErrorString = imp->GetErrorString(); delete imp; } // return imported data. If the import failed the pointer is NULL anyways - ASSIMP_END_EXCEPTION_REGION(const aiScene*); + ASSIMP_END_EXCEPTION_REGION(const aiScene *); return scene; } // ------------------------------------------------------------------------------------------------ // Releases all resources associated with the given import process. -void aiReleaseImport( const aiScene* pScene) -{ +void aiReleaseImport(const aiScene *pScene) { if (!pScene) { return; } @@ -273,15 +268,14 @@ void aiReleaseImport( const aiScene* pScene) ASSIMP_BEGIN_EXCEPTION_REGION(); // find the importer associated with this data - const ScenePrivateData* priv = ScenePriv(pScene); - if( !priv || !priv->mOrigImporter) { + const ScenePrivateData *priv = ScenePriv(pScene); + if (!priv || !priv->mOrigImporter) { delete pScene; - } - else { + } else { // deleting the Importer also deletes the scene // Note: the reason that this is not written as 'delete priv->mOrigImporter' // is a suspected bug in gcc 4.4+ (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52339) - Importer* importer = priv->mOrigImporter; + Importer *importer = priv->mOrigImporter; delete importer; } @@ -289,17 +283,15 @@ void aiReleaseImport( const aiScene* pScene) } // ------------------------------------------------------------------------------------------------ -ASSIMP_API const aiScene* aiApplyPostProcessing(const aiScene* pScene, - unsigned int pFlags) -{ - const aiScene* sc = NULL; - +ASSIMP_API const aiScene *aiApplyPostProcessing(const aiScene *pScene, + unsigned int pFlags) { + const aiScene *sc = NULL; ASSIMP_BEGIN_EXCEPTION_REGION(); // find the importer associated with this data - const ScenePrivateData* priv = ScenePriv(pScene); - if( !priv || !priv->mOrigImporter) { + const ScenePrivateData *priv = ScenePriv(pScene); + if (!priv || !priv->mOrigImporter) { ReportSceneNotFoundError(); return NULL; } @@ -311,61 +303,58 @@ ASSIMP_API const aiScene* aiApplyPostProcessing(const aiScene* pScene, return NULL; } - ASSIMP_END_EXCEPTION_REGION(const aiScene*); + ASSIMP_END_EXCEPTION_REGION(const aiScene *); return sc; } // ------------------------------------------------------------------------------------------------ -ASSIMP_API const aiScene *aiApplyCustomizedPostProcessing( const aiScene *scene, - BaseProcess* process, - bool requestValidation ) { - const aiScene* sc( NULL ); +ASSIMP_API const aiScene *aiApplyCustomizedPostProcessing(const aiScene *scene, + BaseProcess *process, + bool requestValidation) { + const aiScene *sc(NULL); ASSIMP_BEGIN_EXCEPTION_REGION(); // find the importer associated with this data - const ScenePrivateData* priv = ScenePriv( scene ); - if ( NULL == priv || NULL == priv->mOrigImporter ) { + const ScenePrivateData *priv = ScenePriv(scene); + if (NULL == priv || NULL == priv->mOrigImporter) { ReportSceneNotFoundError(); return NULL; } - sc = priv->mOrigImporter->ApplyCustomizedPostProcessing( process, requestValidation ); + sc = priv->mOrigImporter->ApplyCustomizedPostProcessing(process, requestValidation); - if ( !sc ) { - aiReleaseImport( scene ); + if (!sc) { + aiReleaseImport(scene); return NULL; } - ASSIMP_END_EXCEPTION_REGION( const aiScene* ); + ASSIMP_END_EXCEPTION_REGION(const aiScene *); return sc; } // ------------------------------------------------------------------------------------------------ -void CallbackToLogRedirector (const char* msg, char* dt) -{ - ai_assert( NULL != msg ); - ai_assert( NULL != dt ); - LogStream* s = (LogStream*)dt; +void CallbackToLogRedirector(const char *msg, char *dt) { + ai_assert(NULL != msg); + ai_assert(NULL != dt); + LogStream *s = (LogStream *)dt; s->write(msg); } // ------------------------------------------------------------------------------------------------ -ASSIMP_API aiLogStream aiGetPredefinedLogStream(aiDefaultLogStream pStream,const char* file) -{ +ASSIMP_API aiLogStream aiGetPredefinedLogStream(aiDefaultLogStream pStream, const char *file) { aiLogStream sout; ASSIMP_BEGIN_EXCEPTION_REGION(); - LogStream* stream = LogStream::createDefaultStream(pStream,file); + LogStream *stream = LogStream::createDefaultStream(pStream, file); if (!stream) { sout.callback = NULL; sout.user = NULL; - } - else { + } else { sout.callback = &CallbackToLogRedirector; - sout.user = (char*)stream; + sout.user = (char *)stream; } gPredefinedStreams.push_back(stream); ASSIMP_END_EXCEPTION_REGION(aiLogStream); @@ -373,42 +362,40 @@ ASSIMP_API aiLogStream aiGetPredefinedLogStream(aiDefaultLogStream pStream,const } // ------------------------------------------------------------------------------------------------ -ASSIMP_API void aiAttachLogStream( const aiLogStream* stream ) -{ +ASSIMP_API void aiAttachLogStream(const aiLogStream *stream) { ASSIMP_BEGIN_EXCEPTION_REGION(); #ifndef ASSIMP_BUILD_SINGLETHREADED std::lock_guard lock(gLogStreamMutex); #endif - LogStream* lg = new LogToCallbackRedirector(*stream); + LogStream *lg = new LogToCallbackRedirector(*stream); gActiveLogStreams[*stream] = lg; if (DefaultLogger::isNullLogger()) { - DefaultLogger::create(NULL,(gVerboseLogging == AI_TRUE ? Logger::VERBOSE : Logger::NORMAL)); + DefaultLogger::create(NULL, (gVerboseLogging == AI_TRUE ? Logger::VERBOSE : Logger::NORMAL)); } DefaultLogger::get()->attachStream(lg); ASSIMP_END_EXCEPTION_REGION(void); } // ------------------------------------------------------------------------------------------------ -ASSIMP_API aiReturn aiDetachLogStream( const aiLogStream* stream) -{ +ASSIMP_API aiReturn aiDetachLogStream(const aiLogStream *stream) { ASSIMP_BEGIN_EXCEPTION_REGION(); #ifndef ASSIMP_BUILD_SINGLETHREADED std::lock_guard lock(gLogStreamMutex); #endif // find the log-stream associated with this data - LogStreamMap::iterator it = gActiveLogStreams.find( *stream); + LogStreamMap::iterator it = gActiveLogStreams.find(*stream); // it should be there... else the user is playing fools with us - if( it == gActiveLogStreams.end()) { + if (it == gActiveLogStreams.end()) { return AI_FAILURE; } - DefaultLogger::get()->detatchStream( it->second ); + DefaultLogger::get()->detatchStream(it->second); delete it->second; - gActiveLogStreams.erase( it); + gActiveLogStreams.erase(it); if (gActiveLogStreams.empty()) { DefaultLogger::kill(); @@ -418,19 +405,18 @@ ASSIMP_API aiReturn aiDetachLogStream( const aiLogStream* stream) } // ------------------------------------------------------------------------------------------------ -ASSIMP_API void aiDetachAllLogStreams(void) -{ +ASSIMP_API void aiDetachAllLogStreams(void) { ASSIMP_BEGIN_EXCEPTION_REGION(); #ifndef ASSIMP_BUILD_SINGLETHREADED std::lock_guard lock(gLogStreamMutex); #endif - Logger *logger( DefaultLogger::get() ); - if ( NULL == logger ) { + Logger *logger(DefaultLogger::get()); + if (NULL == logger) { return; } for (LogStreamMap::iterator it = gActiveLogStreams.begin(); it != gActiveLogStreams.end(); ++it) { - logger->detatchStream( it->second ); + logger->detatchStream(it->second); delete it->second; } gActiveLogStreams.clear(); @@ -440,8 +426,7 @@ ASSIMP_API void aiDetachAllLogStreams(void) } // ------------------------------------------------------------------------------------------------ -ASSIMP_API void aiEnableVerboseLogging(aiBool d) -{ +ASSIMP_API void aiEnableVerboseLogging(aiBool d) { if (!DefaultLogger::isNullLogger()) { DefaultLogger::get()->setLogSeverity((d == AI_TRUE ? Logger::VERBOSE : Logger::NORMAL)); } @@ -450,31 +435,27 @@ ASSIMP_API void aiEnableVerboseLogging(aiBool d) // ------------------------------------------------------------------------------------------------ // Returns the error text of the last failed import process. -const char* aiGetErrorString() -{ +const char *aiGetErrorString() { return gLastErrorString.c_str(); } // ----------------------------------------------------------------------------------------------- // Return the description of a importer given its index -const aiImporterDesc* aiGetImportFormatDescription( size_t pIndex) -{ +const aiImporterDesc *aiGetImportFormatDescription(size_t pIndex) { return Importer().GetImporterInfo(pIndex); } // ----------------------------------------------------------------------------------------------- // Return the number of importers -size_t aiGetImportFormatCount(void) -{ +size_t aiGetImportFormatCount(void) { return Importer().GetImporterCount(); } // ------------------------------------------------------------------------------------------------ // Returns the error text of the last failed import process. -aiBool aiIsExtensionSupported(const char* szExtension) -{ +aiBool aiIsExtensionSupported(const char *szExtension) { ai_assert(NULL != szExtension); - aiBool candoit=AI_FALSE; + aiBool candoit = AI_FALSE; ASSIMP_BEGIN_EXCEPTION_REGION(); // FIXME: no need to create a temporary Importer instance just for that .. @@ -487,8 +468,7 @@ aiBool aiIsExtensionSupported(const char* szExtension) // ------------------------------------------------------------------------------------------------ // Get a list of all file extensions supported by ASSIMP -void aiGetExtensionList(aiString* szOut) -{ +void aiGetExtensionList(aiString *szOut) { ai_assert(NULL != szOut); ASSIMP_BEGIN_EXCEPTION_REGION(); @@ -501,14 +481,13 @@ void aiGetExtensionList(aiString* szOut) // ------------------------------------------------------------------------------------------------ // Get the memory requirements for a particular import. -void aiGetMemoryRequirements(const C_STRUCT aiScene* pIn, - C_STRUCT aiMemoryInfo* in) -{ +void aiGetMemoryRequirements(const C_STRUCT aiScene *pIn, + C_STRUCT aiMemoryInfo *in) { ASSIMP_BEGIN_EXCEPTION_REGION(); // find the importer associated with this data - const ScenePrivateData* priv = ScenePriv(pIn); - if( !priv || !priv->mOrigImporter) { + const ScenePrivateData *priv = ScenePriv(pIn); + if (!priv || !priv->mOrigImporter) { ReportSceneNotFoundError(); return; } @@ -518,118 +497,106 @@ void aiGetMemoryRequirements(const C_STRUCT aiScene* pIn, } // ------------------------------------------------------------------------------------------------ -ASSIMP_API aiPropertyStore* aiCreatePropertyStore(void) -{ - return reinterpret_cast( new PropertyMap() ); +ASSIMP_API aiPropertyStore *aiCreatePropertyStore(void) { + return reinterpret_cast(new PropertyMap()); } // ------------------------------------------------------------------------------------------------ -ASSIMP_API void aiReleasePropertyStore(aiPropertyStore* p) -{ - delete reinterpret_cast(p); +ASSIMP_API void aiReleasePropertyStore(aiPropertyStore *p) { + delete reinterpret_cast(p); } // ------------------------------------------------------------------------------------------------ // Importer::SetPropertyInteger -ASSIMP_API void aiSetImportPropertyInteger(aiPropertyStore* p, const char* szName, int value) -{ +ASSIMP_API void aiSetImportPropertyInteger(aiPropertyStore *p, const char *szName, int value) { ASSIMP_BEGIN_EXCEPTION_REGION(); - PropertyMap* pp = reinterpret_cast(p); - SetGenericProperty(pp->ints,szName,value); + PropertyMap *pp = reinterpret_cast(p); + SetGenericProperty(pp->ints, szName, value); ASSIMP_END_EXCEPTION_REGION(void); } // ------------------------------------------------------------------------------------------------ // Importer::SetPropertyFloat -ASSIMP_API void aiSetImportPropertyFloat(aiPropertyStore* p, const char* szName, ai_real value) -{ +ASSIMP_API void aiSetImportPropertyFloat(aiPropertyStore *p, const char *szName, ai_real value) { ASSIMP_BEGIN_EXCEPTION_REGION(); - PropertyMap* pp = reinterpret_cast(p); - SetGenericProperty(pp->floats,szName,value); + PropertyMap *pp = reinterpret_cast(p); + SetGenericProperty(pp->floats, szName, value); ASSIMP_END_EXCEPTION_REGION(void); } // ------------------------------------------------------------------------------------------------ // Importer::SetPropertyString -ASSIMP_API void aiSetImportPropertyString(aiPropertyStore* p, const char* szName, - const C_STRUCT aiString* st) -{ +ASSIMP_API void aiSetImportPropertyString(aiPropertyStore *p, const char *szName, + const C_STRUCT aiString *st) { if (!st) { return; } ASSIMP_BEGIN_EXCEPTION_REGION(); - PropertyMap* pp = reinterpret_cast(p); - SetGenericProperty(pp->strings,szName,std::string(st->C_Str())); + PropertyMap *pp = reinterpret_cast(p); + SetGenericProperty(pp->strings, szName, std::string(st->C_Str())); ASSIMP_END_EXCEPTION_REGION(void); } // ------------------------------------------------------------------------------------------------ // Importer::SetPropertyMatrix -ASSIMP_API void aiSetImportPropertyMatrix(aiPropertyStore* p, const char* szName, - const C_STRUCT aiMatrix4x4* mat) -{ +ASSIMP_API void aiSetImportPropertyMatrix(aiPropertyStore *p, const char *szName, + const C_STRUCT aiMatrix4x4 *mat) { if (!mat) { return; } ASSIMP_BEGIN_EXCEPTION_REGION(); - PropertyMap* pp = reinterpret_cast(p); - SetGenericProperty(pp->matrices,szName,*mat); + PropertyMap *pp = reinterpret_cast(p); + SetGenericProperty(pp->matrices, szName, *mat); ASSIMP_END_EXCEPTION_REGION(void); } // ------------------------------------------------------------------------------------------------ // Rotation matrix to quaternion -ASSIMP_API void aiCreateQuaternionFromMatrix(aiQuaternion* quat,const aiMatrix3x3* mat) -{ - ai_assert( NULL != quat ); - ai_assert( NULL != mat ); +ASSIMP_API void aiCreateQuaternionFromMatrix(aiQuaternion *quat, const aiMatrix3x3 *mat) { + ai_assert(NULL != quat); + ai_assert(NULL != mat); *quat = aiQuaternion(*mat); } // ------------------------------------------------------------------------------------------------ // Matrix decomposition -ASSIMP_API void aiDecomposeMatrix(const aiMatrix4x4* mat,aiVector3D* scaling, - aiQuaternion* rotation, - aiVector3D* position) -{ - ai_assert( NULL != rotation ); - ai_assert( NULL != position ); - ai_assert( NULL != scaling ); - ai_assert( NULL != mat ); - mat->Decompose(*scaling,*rotation,*position); +ASSIMP_API void aiDecomposeMatrix(const aiMatrix4x4 *mat, aiVector3D *scaling, + aiQuaternion *rotation, + aiVector3D *position) { + ai_assert(NULL != rotation); + ai_assert(NULL != position); + ai_assert(NULL != scaling); + ai_assert(NULL != mat); + mat->Decompose(*scaling, *rotation, *position); } // ------------------------------------------------------------------------------------------------ // Matrix transpose -ASSIMP_API void aiTransposeMatrix3(aiMatrix3x3* mat) -{ +ASSIMP_API void aiTransposeMatrix3(aiMatrix3x3 *mat) { ai_assert(NULL != mat); mat->Transpose(); } // ------------------------------------------------------------------------------------------------ -ASSIMP_API void aiTransposeMatrix4(aiMatrix4x4* mat) -{ +ASSIMP_API void aiTransposeMatrix4(aiMatrix4x4 *mat) { ai_assert(NULL != mat); mat->Transpose(); } // ------------------------------------------------------------------------------------------------ // Vector transformation -ASSIMP_API void aiTransformVecByMatrix3(aiVector3D* vec, - const aiMatrix3x3* mat) -{ - ai_assert( NULL != mat ); - ai_assert( NULL != vec); +ASSIMP_API void aiTransformVecByMatrix3(aiVector3D *vec, + const aiMatrix3x3 *mat) { + ai_assert(NULL != mat); + ai_assert(NULL != vec); *vec *= (*mat); } // ------------------------------------------------------------------------------------------------ -ASSIMP_API void aiTransformVecByMatrix4(aiVector3D* vec, - const aiMatrix4x4* mat) -{ - ai_assert( NULL != mat ); - ai_assert( NULL != vec ); +ASSIMP_API void aiTransformVecByMatrix4(aiVector3D *vec, + const aiMatrix4x4 *mat) { + ai_assert(NULL != mat); + ai_assert(NULL != vec); *vec *= (*mat); } @@ -637,52 +604,48 @@ ASSIMP_API void aiTransformVecByMatrix4(aiVector3D* vec, // ------------------------------------------------------------------------------------------------ // Matrix multiplication ASSIMP_API void aiMultiplyMatrix4( - aiMatrix4x4* dst, - const aiMatrix4x4* src) -{ - ai_assert( NULL != dst ); - ai_assert( NULL != src ); + aiMatrix4x4 *dst, + const aiMatrix4x4 *src) { + ai_assert(NULL != dst); + ai_assert(NULL != src); *dst = (*dst) * (*src); } // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiMultiplyMatrix3( - aiMatrix3x3* dst, - const aiMatrix3x3* src) -{ - ai_assert( NULL != dst ); - ai_assert( NULL != src ); + aiMatrix3x3 *dst, + const aiMatrix3x3 *src) { + ai_assert(NULL != dst); + ai_assert(NULL != src); *dst = (*dst) * (*src); } // ------------------------------------------------------------------------------------------------ // Matrix identity ASSIMP_API void aiIdentityMatrix3( - aiMatrix3x3* mat) -{ + aiMatrix3x3 *mat) { ai_assert(NULL != mat); *mat = aiMatrix3x3(); } // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiIdentityMatrix4( - aiMatrix4x4* mat) -{ + aiMatrix4x4 *mat) { ai_assert(NULL != mat); *mat = aiMatrix4x4(); } // ------------------------------------------------------------------------------------------------ -ASSIMP_API C_STRUCT const aiImporterDesc* aiGetImporterDesc( const char *extension ) { - if( NULL == extension ) { +ASSIMP_API C_STRUCT const aiImporterDesc *aiGetImporterDesc(const char *extension) { + if (NULL == extension) { return NULL; } - const aiImporterDesc *desc( NULL ); - std::vector< BaseImporter* > out; - GetImporterInstanceList( out ); - for( size_t i = 0; i < out.size(); ++i ) { - if( 0 == strncmp( out[ i ]->GetInfo()->mFileExtensions, extension, strlen( extension ) ) ) { - desc = out[ i ]->GetInfo(); + const aiImporterDesc *desc(NULL); + std::vector out; + GetImporterInstanceList(out); + for (size_t i = 0; i < out.size(); ++i) { + if (0 == strncmp(out[i]->GetInfo()->mFileExtensions, extension, strlen(extension))) { + desc = out[i]->GetInfo(); break; } } @@ -694,8 +657,8 @@ ASSIMP_API C_STRUCT const aiImporterDesc* aiGetImporterDesc( const char *extensi // ------------------------------------------------------------------------------------------------ ASSIMP_API int aiVector2AreEqual( - const C_STRUCT aiVector2D* a, - const C_STRUCT aiVector2D* b) { + const C_STRUCT aiVector2D *a, + const C_STRUCT aiVector2D *b) { ai_assert(NULL != a); ai_assert(NULL != b); return *a == *b; @@ -703,9 +666,9 @@ ASSIMP_API int aiVector2AreEqual( // ------------------------------------------------------------------------------------------------ ASSIMP_API int aiVector2AreEqualEpsilon( - const C_STRUCT aiVector2D* a, - const C_STRUCT aiVector2D* b, - const float epsilon) { + const C_STRUCT aiVector2D *a, + const C_STRUCT aiVector2D *b, + const float epsilon) { ai_assert(NULL != a); ai_assert(NULL != b); return a->Equal(*b, epsilon); @@ -713,8 +676,8 @@ ASSIMP_API int aiVector2AreEqualEpsilon( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiVector2Add( - C_STRUCT aiVector2D* dst, - const C_STRUCT aiVector2D* src) { + C_STRUCT aiVector2D *dst, + const C_STRUCT aiVector2D *src) { ai_assert(NULL != dst); ai_assert(NULL != src); *dst = *dst + *src; @@ -722,8 +685,8 @@ ASSIMP_API void aiVector2Add( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiVector2Subtract( - C_STRUCT aiVector2D* dst, - const C_STRUCT aiVector2D* src) { + C_STRUCT aiVector2D *dst, + const C_STRUCT aiVector2D *src) { ai_assert(NULL != dst); ai_assert(NULL != src); *dst = *dst - *src; @@ -731,16 +694,16 @@ ASSIMP_API void aiVector2Subtract( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiVector2Scale( - C_STRUCT aiVector2D* dst, - const float s) { + C_STRUCT aiVector2D *dst, + const float s) { ai_assert(NULL != dst); *dst *= s; } // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiVector2SymMul( - C_STRUCT aiVector2D* dst, - const C_STRUCT aiVector2D* other) { + C_STRUCT aiVector2D *dst, + const C_STRUCT aiVector2D *other) { ai_assert(NULL != dst); ai_assert(NULL != other); *dst = dst->SymMul(*other); @@ -748,16 +711,16 @@ ASSIMP_API void aiVector2SymMul( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiVector2DivideByScalar( - C_STRUCT aiVector2D* dst, - const float s) { + C_STRUCT aiVector2D *dst, + const float s) { ai_assert(NULL != dst); *dst /= s; } // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiVector2DivideByVector( - C_STRUCT aiVector2D* dst, - C_STRUCT aiVector2D* v) { + C_STRUCT aiVector2D *dst, + C_STRUCT aiVector2D *v) { ai_assert(NULL != dst); ai_assert(NULL != v); *dst = *dst / *v; @@ -765,29 +728,29 @@ ASSIMP_API void aiVector2DivideByVector( // ------------------------------------------------------------------------------------------------ ASSIMP_API float aiVector2Length( - const C_STRUCT aiVector2D* v) { + const C_STRUCT aiVector2D *v) { ai_assert(NULL != v); return v->Length(); } // ------------------------------------------------------------------------------------------------ ASSIMP_API float aiVector2SquareLength( - const C_STRUCT aiVector2D* v) { + const C_STRUCT aiVector2D *v) { ai_assert(NULL != v); return v->SquareLength(); } // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiVector2Negate( - C_STRUCT aiVector2D* dst) { + C_STRUCT aiVector2D *dst) { ai_assert(NULL != dst); *dst = -(*dst); } // ------------------------------------------------------------------------------------------------ ASSIMP_API float aiVector2DotProduct( - const C_STRUCT aiVector2D* a, - const C_STRUCT aiVector2D* b) { + const C_STRUCT aiVector2D *a, + const C_STRUCT aiVector2D *b) { ai_assert(NULL != a); ai_assert(NULL != b); return (*a) * (*b); @@ -795,15 +758,15 @@ ASSIMP_API float aiVector2DotProduct( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiVector2Normalize( - C_STRUCT aiVector2D* v) { + C_STRUCT aiVector2D *v) { ai_assert(NULL != v); v->Normalize(); } // ------------------------------------------------------------------------------------------------ ASSIMP_API int aiVector3AreEqual( - const C_STRUCT aiVector3D* a, - const C_STRUCT aiVector3D* b) { + const C_STRUCT aiVector3D *a, + const C_STRUCT aiVector3D *b) { ai_assert(NULL != a); ai_assert(NULL != b); return *a == *b; @@ -811,9 +774,9 @@ ASSIMP_API int aiVector3AreEqual( // ------------------------------------------------------------------------------------------------ ASSIMP_API int aiVector3AreEqualEpsilon( - const C_STRUCT aiVector3D* a, - const C_STRUCT aiVector3D* b, - const float epsilon) { + const C_STRUCT aiVector3D *a, + const C_STRUCT aiVector3D *b, + const float epsilon) { ai_assert(NULL != a); ai_assert(NULL != b); return a->Equal(*b, epsilon); @@ -821,8 +784,8 @@ ASSIMP_API int aiVector3AreEqualEpsilon( // ------------------------------------------------------------------------------------------------ ASSIMP_API int aiVector3LessThan( - const C_STRUCT aiVector3D* a, - const C_STRUCT aiVector3D* b) { + const C_STRUCT aiVector3D *a, + const C_STRUCT aiVector3D *b) { ai_assert(NULL != a); ai_assert(NULL != b); return *a < *b; @@ -830,8 +793,8 @@ ASSIMP_API int aiVector3LessThan( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiVector3Add( - C_STRUCT aiVector3D* dst, - const C_STRUCT aiVector3D* src) { + C_STRUCT aiVector3D *dst, + const C_STRUCT aiVector3D *src) { ai_assert(NULL != dst); ai_assert(NULL != src); *dst = *dst + *src; @@ -839,8 +802,8 @@ ASSIMP_API void aiVector3Add( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiVector3Subtract( - C_STRUCT aiVector3D* dst, - const C_STRUCT aiVector3D* src) { + C_STRUCT aiVector3D *dst, + const C_STRUCT aiVector3D *src) { ai_assert(NULL != dst); ai_assert(NULL != src); *dst = *dst - *src; @@ -848,16 +811,16 @@ ASSIMP_API void aiVector3Subtract( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiVector3Scale( - C_STRUCT aiVector3D* dst, - const float s) { + C_STRUCT aiVector3D *dst, + const float s) { ai_assert(NULL != dst); *dst *= s; } // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiVector3SymMul( - C_STRUCT aiVector3D* dst, - const C_STRUCT aiVector3D* other) { + C_STRUCT aiVector3D *dst, + const C_STRUCT aiVector3D *other) { ai_assert(NULL != dst); ai_assert(NULL != other); *dst = dst->SymMul(*other); @@ -865,15 +828,15 @@ ASSIMP_API void aiVector3SymMul( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiVector3DivideByScalar( - C_STRUCT aiVector3D* dst, const float s) { + C_STRUCT aiVector3D *dst, const float s) { ai_assert(NULL != dst); *dst /= s; } // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiVector3DivideByVector( - C_STRUCT aiVector3D* dst, - C_STRUCT aiVector3D* v) { + C_STRUCT aiVector3D *dst, + C_STRUCT aiVector3D *v) { ai_assert(NULL != dst); ai_assert(NULL != v); *dst = *dst / *v; @@ -881,29 +844,29 @@ ASSIMP_API void aiVector3DivideByVector( // ------------------------------------------------------------------------------------------------ ASSIMP_API float aiVector3Length( - const C_STRUCT aiVector3D* v) { + const C_STRUCT aiVector3D *v) { ai_assert(NULL != v); return v->Length(); } // ------------------------------------------------------------------------------------------------ ASSIMP_API float aiVector3SquareLength( - const C_STRUCT aiVector3D* v) { + const C_STRUCT aiVector3D *v) { ai_assert(NULL != v); return v->SquareLength(); } // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiVector3Negate( - C_STRUCT aiVector3D* dst) { + C_STRUCT aiVector3D *dst) { ai_assert(NULL != dst); *dst = -(*dst); } // ------------------------------------------------------------------------------------------------ ASSIMP_API float aiVector3DotProduct( - const C_STRUCT aiVector3D* a, - const C_STRUCT aiVector3D* b) { + const C_STRUCT aiVector3D *a, + const C_STRUCT aiVector3D *b) { ai_assert(NULL != a); ai_assert(NULL != b); return (*a) * (*b); @@ -911,9 +874,9 @@ ASSIMP_API float aiVector3DotProduct( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiVector3CrossProduct( - C_STRUCT aiVector3D* dst, - const C_STRUCT aiVector3D* a, - const C_STRUCT aiVector3D* b) { + C_STRUCT aiVector3D *dst, + const C_STRUCT aiVector3D *a, + const C_STRUCT aiVector3D *b) { ai_assert(NULL != dst); ai_assert(NULL != a); ai_assert(NULL != b); @@ -922,22 +885,22 @@ ASSIMP_API void aiVector3CrossProduct( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiVector3Normalize( - C_STRUCT aiVector3D* v) { + C_STRUCT aiVector3D *v) { ai_assert(NULL != v); v->Normalize(); } // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiVector3NormalizeSafe( - C_STRUCT aiVector3D* v) { + C_STRUCT aiVector3D *v) { ai_assert(NULL != v); v->NormalizeSafe(); } // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiVector3RotateByQuaternion( - C_STRUCT aiVector3D* v, - const C_STRUCT aiQuaternion* q) { + C_STRUCT aiVector3D *v, + const C_STRUCT aiQuaternion *q) { ai_assert(NULL != v); ai_assert(NULL != q); *v = q->Rotate(*v); @@ -945,8 +908,8 @@ ASSIMP_API void aiVector3RotateByQuaternion( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiMatrix3FromMatrix4( - C_STRUCT aiMatrix3x3* dst, - const C_STRUCT aiMatrix4x4* mat) { + C_STRUCT aiMatrix3x3 *dst, + const C_STRUCT aiMatrix4x4 *mat) { ai_assert(NULL != dst); ai_assert(NULL != mat); *dst = aiMatrix3x3(*mat); @@ -954,8 +917,8 @@ ASSIMP_API void aiMatrix3FromMatrix4( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiMatrix3FromQuaternion( - C_STRUCT aiMatrix3x3* mat, - const C_STRUCT aiQuaternion* q) { + C_STRUCT aiMatrix3x3 *mat, + const C_STRUCT aiQuaternion *q) { ai_assert(NULL != mat); ai_assert(NULL != q); *mat = q->GetMatrix(); @@ -963,8 +926,8 @@ ASSIMP_API void aiMatrix3FromQuaternion( // ------------------------------------------------------------------------------------------------ ASSIMP_API int aiMatrix3AreEqual( - const C_STRUCT aiMatrix3x3* a, - const C_STRUCT aiMatrix3x3* b) { + const C_STRUCT aiMatrix3x3 *a, + const C_STRUCT aiMatrix3x3 *b) { ai_assert(NULL != a); ai_assert(NULL != b); return *a == *b; @@ -972,39 +935,39 @@ ASSIMP_API int aiMatrix3AreEqual( // ------------------------------------------------------------------------------------------------ ASSIMP_API int aiMatrix3AreEqualEpsilon( - const C_STRUCT aiMatrix3x3* a, - const C_STRUCT aiMatrix3x3* b, - const float epsilon) { + const C_STRUCT aiMatrix3x3 *a, + const C_STRUCT aiMatrix3x3 *b, + const float epsilon) { ai_assert(NULL != a); ai_assert(NULL != b); return a->Equal(*b, epsilon); } // ------------------------------------------------------------------------------------------------ -ASSIMP_API void aiMatrix3Inverse(C_STRUCT aiMatrix3x3* mat) { +ASSIMP_API void aiMatrix3Inverse(C_STRUCT aiMatrix3x3 *mat) { ai_assert(NULL != mat); mat->Inverse(); } // ------------------------------------------------------------------------------------------------ -ASSIMP_API float aiMatrix3Determinant(const C_STRUCT aiMatrix3x3* mat) { +ASSIMP_API float aiMatrix3Determinant(const C_STRUCT aiMatrix3x3 *mat) { ai_assert(NULL != mat); return mat->Determinant(); } // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiMatrix3RotationZ( - C_STRUCT aiMatrix3x3* mat, - const float angle) { + C_STRUCT aiMatrix3x3 *mat, + const float angle) { ai_assert(NULL != mat); aiMatrix3x3::RotationZ(angle, *mat); } // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiMatrix3FromRotationAroundAxis( - C_STRUCT aiMatrix3x3* mat, - const C_STRUCT aiVector3D* axis, - const float angle) { + C_STRUCT aiMatrix3x3 *mat, + const C_STRUCT aiVector3D *axis, + const float angle) { ai_assert(NULL != mat); ai_assert(NULL != axis); aiMatrix3x3::Rotation(angle, *axis, *mat); @@ -1012,8 +975,8 @@ ASSIMP_API void aiMatrix3FromRotationAroundAxis( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiMatrix3Translation( - C_STRUCT aiMatrix3x3* mat, - const C_STRUCT aiVector2D* translation) { + C_STRUCT aiMatrix3x3 *mat, + const C_STRUCT aiVector2D *translation) { ai_assert(NULL != mat); ai_assert(NULL != translation); aiMatrix3x3::Translation(*translation, *mat); @@ -1021,9 +984,9 @@ ASSIMP_API void aiMatrix3Translation( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiMatrix3FromTo( - C_STRUCT aiMatrix3x3* mat, - const C_STRUCT aiVector3D* from, - const C_STRUCT aiVector3D* to) { + C_STRUCT aiMatrix3x3 *mat, + const C_STRUCT aiVector3D *from, + const C_STRUCT aiVector3D *to) { ai_assert(NULL != mat); ai_assert(NULL != from); ai_assert(NULL != to); @@ -1032,8 +995,8 @@ ASSIMP_API void aiMatrix3FromTo( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiMatrix4FromMatrix3( - C_STRUCT aiMatrix4x4* dst, - const C_STRUCT aiMatrix3x3* mat) { + C_STRUCT aiMatrix4x4 *dst, + const C_STRUCT aiMatrix3x3 *mat) { ai_assert(NULL != dst); ai_assert(NULL != mat); *dst = aiMatrix4x4(*mat); @@ -1041,10 +1004,10 @@ ASSIMP_API void aiMatrix4FromMatrix3( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiMatrix4FromScalingQuaternionPosition( - C_STRUCT aiMatrix4x4* mat, - const C_STRUCT aiVector3D* scaling, - const C_STRUCT aiQuaternion* rotation, - const C_STRUCT aiVector3D* position) { + C_STRUCT aiMatrix4x4 *mat, + const C_STRUCT aiVector3D *scaling, + const C_STRUCT aiQuaternion *rotation, + const C_STRUCT aiVector3D *position) { ai_assert(NULL != mat); ai_assert(NULL != scaling); ai_assert(NULL != rotation); @@ -1054,8 +1017,8 @@ ASSIMP_API void aiMatrix4FromScalingQuaternionPosition( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiMatrix4Add( - C_STRUCT aiMatrix4x4* dst, - const C_STRUCT aiMatrix4x4* src) { + C_STRUCT aiMatrix4x4 *dst, + const C_STRUCT aiMatrix4x4 *src) { ai_assert(NULL != dst); ai_assert(NULL != src); *dst = *dst + *src; @@ -1063,8 +1026,8 @@ ASSIMP_API void aiMatrix4Add( // ------------------------------------------------------------------------------------------------ ASSIMP_API int aiMatrix4AreEqual( - const C_STRUCT aiMatrix4x4* a, - const C_STRUCT aiMatrix4x4* b) { + const C_STRUCT aiMatrix4x4 *a, + const C_STRUCT aiMatrix4x4 *b) { ai_assert(NULL != a); ai_assert(NULL != b); return *a == *b; @@ -1072,38 +1035,38 @@ ASSIMP_API int aiMatrix4AreEqual( // ------------------------------------------------------------------------------------------------ ASSIMP_API int aiMatrix4AreEqualEpsilon( - const C_STRUCT aiMatrix4x4* a, - const C_STRUCT aiMatrix4x4* b, - const float epsilon) { + const C_STRUCT aiMatrix4x4 *a, + const C_STRUCT aiMatrix4x4 *b, + const float epsilon) { ai_assert(NULL != a); ai_assert(NULL != b); return a->Equal(*b, epsilon); } // ------------------------------------------------------------------------------------------------ -ASSIMP_API void aiMatrix4Inverse(C_STRUCT aiMatrix4x4* mat) { +ASSIMP_API void aiMatrix4Inverse(C_STRUCT aiMatrix4x4 *mat) { ai_assert(NULL != mat); mat->Inverse(); } // ------------------------------------------------------------------------------------------------ -ASSIMP_API float aiMatrix4Determinant(const C_STRUCT aiMatrix4x4* mat) { +ASSIMP_API float aiMatrix4Determinant(const C_STRUCT aiMatrix4x4 *mat) { ai_assert(NULL != mat); return mat->Determinant(); } // ------------------------------------------------------------------------------------------------ -ASSIMP_API int aiMatrix4IsIdentity(const C_STRUCT aiMatrix4x4* mat) { +ASSIMP_API int aiMatrix4IsIdentity(const C_STRUCT aiMatrix4x4 *mat) { ai_assert(NULL != mat); return mat->IsIdentity(); } // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiMatrix4DecomposeIntoScalingEulerAnglesPosition( - const C_STRUCT aiMatrix4x4* mat, - C_STRUCT aiVector3D* scaling, - C_STRUCT aiVector3D* rotation, - C_STRUCT aiVector3D* position) { + const C_STRUCT aiMatrix4x4 *mat, + C_STRUCT aiVector3D *scaling, + C_STRUCT aiVector3D *rotation, + C_STRUCT aiVector3D *position) { ai_assert(NULL != mat); ai_assert(NULL != scaling); ai_assert(NULL != rotation); @@ -1113,11 +1076,11 @@ ASSIMP_API void aiMatrix4DecomposeIntoScalingEulerAnglesPosition( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiMatrix4DecomposeIntoScalingAxisAnglePosition( - const C_STRUCT aiMatrix4x4* mat, - C_STRUCT aiVector3D* scaling, - C_STRUCT aiVector3D* axis, - float* angle, - C_STRUCT aiVector3D* position) { + const C_STRUCT aiMatrix4x4 *mat, + C_STRUCT aiVector3D *scaling, + C_STRUCT aiVector3D *axis, + float *angle, + C_STRUCT aiVector3D *position) { ai_assert(NULL != mat); ai_assert(NULL != scaling); ai_assert(NULL != axis); @@ -1128,9 +1091,9 @@ ASSIMP_API void aiMatrix4DecomposeIntoScalingAxisAnglePosition( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiMatrix4DecomposeNoScaling( - const C_STRUCT aiMatrix4x4* mat, - C_STRUCT aiQuaternion* rotation, - C_STRUCT aiVector3D* position) { + const C_STRUCT aiMatrix4x4 *mat, + C_STRUCT aiQuaternion *rotation, + C_STRUCT aiVector3D *position) { ai_assert(NULL != mat); ai_assert(NULL != rotation); ai_assert(NULL != position); @@ -1139,41 +1102,41 @@ ASSIMP_API void aiMatrix4DecomposeNoScaling( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiMatrix4FromEulerAngles( - C_STRUCT aiMatrix4x4* mat, - float x, float y, float z) { + C_STRUCT aiMatrix4x4 *mat, + float x, float y, float z) { ai_assert(NULL != mat); mat->FromEulerAnglesXYZ(x, y, z); } // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiMatrix4RotationX( - C_STRUCT aiMatrix4x4* mat, - const float angle) { + C_STRUCT aiMatrix4x4 *mat, + const float angle) { ai_assert(NULL != mat); aiMatrix4x4::RotationX(angle, *mat); } // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiMatrix4RotationY( - C_STRUCT aiMatrix4x4* mat, - const float angle) { + C_STRUCT aiMatrix4x4 *mat, + const float angle) { ai_assert(NULL != mat); aiMatrix4x4::RotationY(angle, *mat); } // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiMatrix4RotationZ( - C_STRUCT aiMatrix4x4* mat, - const float angle) { + C_STRUCT aiMatrix4x4 *mat, + const float angle) { ai_assert(NULL != mat); aiMatrix4x4::RotationZ(angle, *mat); } // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiMatrix4FromRotationAroundAxis( - C_STRUCT aiMatrix4x4* mat, - const C_STRUCT aiVector3D* axis, - const float angle) { + C_STRUCT aiMatrix4x4 *mat, + const C_STRUCT aiVector3D *axis, + const float angle) { ai_assert(NULL != mat); ai_assert(NULL != axis); aiMatrix4x4::Rotation(angle, *axis, *mat); @@ -1181,8 +1144,8 @@ ASSIMP_API void aiMatrix4FromRotationAroundAxis( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiMatrix4Translation( - C_STRUCT aiMatrix4x4* mat, - const C_STRUCT aiVector3D* translation) { + C_STRUCT aiMatrix4x4 *mat, + const C_STRUCT aiVector3D *translation) { ai_assert(NULL != mat); ai_assert(NULL != translation); aiMatrix4x4::Translation(*translation, *mat); @@ -1190,8 +1153,8 @@ ASSIMP_API void aiMatrix4Translation( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiMatrix4Scaling( - C_STRUCT aiMatrix4x4* mat, - const C_STRUCT aiVector3D* scaling) { + C_STRUCT aiMatrix4x4 *mat, + const C_STRUCT aiVector3D *scaling) { ai_assert(NULL != mat); ai_assert(NULL != scaling); aiMatrix4x4::Scaling(*scaling, *mat); @@ -1199,9 +1162,9 @@ ASSIMP_API void aiMatrix4Scaling( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiMatrix4FromTo( - C_STRUCT aiMatrix4x4* mat, - const C_STRUCT aiVector3D* from, - const C_STRUCT aiVector3D* to) { + C_STRUCT aiMatrix4x4 *mat, + const C_STRUCT aiVector3D *from, + const C_STRUCT aiVector3D *to) { ai_assert(NULL != mat); ai_assert(NULL != from); ai_assert(NULL != to); @@ -1210,17 +1173,17 @@ ASSIMP_API void aiMatrix4FromTo( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiQuaternionFromEulerAngles( - C_STRUCT aiQuaternion* q, - float x, float y, float z) { + C_STRUCT aiQuaternion *q, + float x, float y, float z) { ai_assert(NULL != q); *q = aiQuaternion(x, y, z); } // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiQuaternionFromAxisAngle( - C_STRUCT aiQuaternion* q, - const C_STRUCT aiVector3D* axis, - const float angle) { + C_STRUCT aiQuaternion *q, + const C_STRUCT aiVector3D *axis, + const float angle) { ai_assert(NULL != q); ai_assert(NULL != axis); *q = aiQuaternion(*axis, angle); @@ -1228,8 +1191,8 @@ ASSIMP_API void aiQuaternionFromAxisAngle( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiQuaternionFromNormalizedQuaternion( - C_STRUCT aiQuaternion* q, - const C_STRUCT aiVector3D* normalized) { + C_STRUCT aiQuaternion *q, + const C_STRUCT aiVector3D *normalized) { ai_assert(NULL != q); ai_assert(NULL != normalized); *q = aiQuaternion(*normalized); @@ -1237,8 +1200,8 @@ ASSIMP_API void aiQuaternionFromNormalizedQuaternion( // ------------------------------------------------------------------------------------------------ ASSIMP_API int aiQuaternionAreEqual( - const C_STRUCT aiQuaternion* a, - const C_STRUCT aiQuaternion* b) { + const C_STRUCT aiQuaternion *a, + const C_STRUCT aiQuaternion *b) { ai_assert(NULL != a); ai_assert(NULL != b); return *a == *b; @@ -1246,9 +1209,9 @@ ASSIMP_API int aiQuaternionAreEqual( // ------------------------------------------------------------------------------------------------ ASSIMP_API int aiQuaternionAreEqualEpsilon( - const C_STRUCT aiQuaternion* a, - const C_STRUCT aiQuaternion* b, - const float epsilon) { + const C_STRUCT aiQuaternion *a, + const C_STRUCT aiQuaternion *b, + const float epsilon) { ai_assert(NULL != a); ai_assert(NULL != b); return a->Equal(*b, epsilon); @@ -1256,22 +1219,22 @@ ASSIMP_API int aiQuaternionAreEqualEpsilon( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiQuaternionNormalize( - C_STRUCT aiQuaternion* q) { + C_STRUCT aiQuaternion *q) { ai_assert(NULL != q); q->Normalize(); } // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiQuaternionConjugate( - C_STRUCT aiQuaternion* q) { + C_STRUCT aiQuaternion *q) { ai_assert(NULL != q); q->Conjugate(); } // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiQuaternionMultiply( - C_STRUCT aiQuaternion* dst, - const C_STRUCT aiQuaternion* q) { + C_STRUCT aiQuaternion *dst, + const C_STRUCT aiQuaternion *q) { ai_assert(NULL != dst); ai_assert(NULL != q); *dst = (*dst) * (*q); @@ -1279,10 +1242,10 @@ ASSIMP_API void aiQuaternionMultiply( // ------------------------------------------------------------------------------------------------ ASSIMP_API void aiQuaternionInterpolate( - C_STRUCT aiQuaternion* dst, - const C_STRUCT aiQuaternion* start, - const C_STRUCT aiQuaternion* end, - const float factor) { + C_STRUCT aiQuaternion *dst, + const C_STRUCT aiQuaternion *start, + const C_STRUCT aiQuaternion *end, + const float factor) { ai_assert(NULL != dst); ai_assert(NULL != start); ai_assert(NULL != end); diff --git a/code/Common/Exporter.cpp b/code/Common/Exporter.cpp index 66bb921d7..c34457be5 100644 --- a/code/Common/Exporter.cpp +++ b/code/Common/Exporter.cpp @@ -83,32 +83,61 @@ namespace Assimp { void GetPostProcessingStepInstanceList(std::vector< BaseProcess* >& out); // ------------------------------------------------------------------------------------------------ -// Exporter worker function prototypes. Should not be necessary to #ifndef them, it's just a prototype -// do not use const, because some exporter need to convert the scene temporary +// Exporter worker function prototypes. Do not use const, because some exporter need to convert +// the scene temporary +#ifndef ASSIMP_BUILD_NO_COLLADA_EXPORTER void ExportSceneCollada(const char*,IOSystem*, const aiScene*, const ExportProperties*); +#endif +#ifndef ASSIMP_BUILD_NO_X_EXPORTER void ExportSceneXFile(const char*,IOSystem*, const aiScene*, const ExportProperties*); +#endif +#ifndef ASSIMP_BUILD_NO_STEP_EXPORTER void ExportSceneStep(const char*,IOSystem*, const aiScene*, const ExportProperties*); +#endif +#ifndef ASSIMP_BUILD_NO_OBJ_EXPORTER void ExportSceneObj(const char*,IOSystem*, const aiScene*, const ExportProperties*); void ExportSceneObjNoMtl(const char*,IOSystem*, const aiScene*, const ExportProperties*); +#endif +#ifndef ASSIMP_BUILD_NO_STL_EXPORTER void ExportSceneSTL(const char*,IOSystem*, const aiScene*, const ExportProperties*); void ExportSceneSTLBinary(const char*,IOSystem*, const aiScene*, const ExportProperties*); +#endif +#ifndef ASSIMP_BUILD_NO_PLY_EXPORTER void ExportScenePly(const char*,IOSystem*, const aiScene*, const ExportProperties*); void ExportScenePlyBinary(const char*, IOSystem*, const aiScene*, const ExportProperties*); +#endif +#ifndef ASSIMP_BUILD_NO_3DS_EXPORTER void ExportScene3DS(const char*, IOSystem*, const aiScene*, const ExportProperties*); +#endif +#ifndef ASSIMP_BUILD_NO_GLTF_EXPORTER void ExportSceneGLTF(const char*, IOSystem*, const aiScene*, const ExportProperties*); void ExportSceneGLB(const char*, IOSystem*, const aiScene*, const ExportProperties*); void ExportSceneGLTF2(const char*, IOSystem*, const aiScene*, const ExportProperties*); void ExportSceneGLB2(const char*, IOSystem*, const aiScene*, const ExportProperties*); +#endif +#ifndef ASSIMP_BUILD_NO_ASSBIN_EXPORTER void ExportSceneAssbin(const char*, IOSystem*, const aiScene*, const ExportProperties*); +#endif +#ifndef ASSIMP_BUILD_NO_ASSXML_EXPORTER void ExportSceneAssxml(const char*, IOSystem*, const aiScene*, const ExportProperties*); +#endif +#ifndef ASSIMP_BUILD_NO_X3D_EXPORTER void ExportSceneX3D(const char*, IOSystem*, const aiScene*, const ExportProperties*); +#endif +#ifndef ASSIMP_BUILD_NO_FBX_EXPORTER void ExportSceneFBX(const char*, IOSystem*, const aiScene*, const ExportProperties*); void ExportSceneFBXA(const char*, IOSystem*, const aiScene*, const ExportProperties*); +#endif +#ifndef ASSIMP_BUILD_NO_3MF_EXPORTER void ExportScene3MF( const char*, IOSystem*, const aiScene*, const ExportProperties* ); +#endif +#ifndef ASSIMP_BUILD_NO_M3D_EXPORTER void ExportSceneM3D(const char*, IOSystem*, const aiScene*, const ExportProperties*); void ExportSceneM3DA(const char*, IOSystem*, const aiScene*, const ExportProperties*); +#endif +#ifndef ASSIMP_BUILD_NO_ASSJSON_EXPORTER void ExportAssimp2Json(const char* , IOSystem*, const aiScene* , const Assimp::ExportProperties*); - +#endif static void setupExporterArray(std::vector &exporters) { #ifndef ASSIMP_BUILD_NO_COLLADA_EXPORTER diff --git a/code/Common/SceneCombiner.cpp b/code/Common/SceneCombiner.cpp index 29b6082a8..62efe2ece 100644 --- a/code/Common/SceneCombiner.cpp +++ b/code/Common/SceneCombiner.cpp @@ -979,7 +979,7 @@ void GetArrayCopy(Type*& dest, ai_uint num ) { dest = new Type[num]; ::memcpy(dest, old, sizeof(Type) * num); -} + } // ------------------------------------------------------------------------------------------------ void SceneCombiner::CopySceneFlat(aiScene** _dest,const aiScene* src) { @@ -994,8 +994,7 @@ void SceneCombiner::CopySceneFlat(aiScene** _dest,const aiScene* src) { } else { *_dest = new aiScene(); } - - ::memcpy(*_dest,src,sizeof(aiScene)); + CopyScene(_dest, src, false); } // ------------------------------------------------------------------------------------------------ @@ -1066,7 +1065,7 @@ void SceneCombiner::Copy( aiMesh** _dest, const aiMesh* src ) { aiMesh* dest = *_dest = new aiMesh(); // get a flat copy - ::memcpy(dest,src,sizeof(aiMesh)); + *dest = *src; // and reallocate all arrays GetArrayCopy( dest->mVertices, dest->mNumVertices ); @@ -1105,7 +1104,7 @@ void SceneCombiner::Copy(aiAnimMesh** _dest, const aiAnimMesh* src) { aiAnimMesh* dest = *_dest = new aiAnimMesh(); // get a flat copy - ::memcpy(dest, src, sizeof(aiAnimMesh)); + *dest = *src; // and reallocate all arrays GetArrayCopy(dest->mVertices, dest->mNumVertices); @@ -1162,7 +1161,7 @@ void SceneCombiner::Copy(aiTexture** _dest, const aiTexture* src) { aiTexture* dest = *_dest = new aiTexture(); // get a flat copy - ::memcpy(dest,src,sizeof(aiTexture)); + *dest = *src; // and reallocate all arrays. We must do it manually here const char* old = (const char*)dest->pcData; @@ -1192,7 +1191,7 @@ void SceneCombiner::Copy( aiAnimation** _dest, const aiAnimation* src ) { aiAnimation* dest = *_dest = new aiAnimation(); // get a flat copy - ::memcpy(dest,src,sizeof(aiAnimation)); + *dest = *src; // and reallocate all arrays CopyPtrArray( dest->mChannels, src->mChannels, dest->mNumChannels ); @@ -1208,7 +1207,7 @@ void SceneCombiner::Copy(aiNodeAnim** _dest, const aiNodeAnim* src) { aiNodeAnim* dest = *_dest = new aiNodeAnim(); // get a flat copy - ::memcpy(dest,src,sizeof(aiNodeAnim)); + *dest = *src; // and reallocate all arrays GetArrayCopy( dest->mPositionKeys, dest->mNumPositionKeys ); @@ -1224,7 +1223,7 @@ void SceneCombiner::Copy(aiMeshMorphAnim** _dest, const aiMeshMorphAnim* src) { aiMeshMorphAnim* dest = *_dest = new aiMeshMorphAnim(); // get a flat copy - ::memcpy(dest,src,sizeof(aiMeshMorphAnim)); + *dest = *src; // and reallocate all arrays GetArrayCopy( dest->mKeys, dest->mNumKeys ); @@ -1245,7 +1244,7 @@ void SceneCombiner::Copy( aiCamera** _dest,const aiCamera* src) { aiCamera* dest = *_dest = new aiCamera(); // get a flat copy, that's already OK - ::memcpy(dest,src,sizeof(aiCamera)); + *dest = *src; } // ------------------------------------------------------------------------------------------------ @@ -1257,7 +1256,7 @@ void SceneCombiner::Copy(aiLight** _dest, const aiLight* src) { aiLight* dest = *_dest = new aiLight(); // get a flat copy, that's already OK - ::memcpy(dest,src,sizeof(aiLight)); + *dest = *src; } // ------------------------------------------------------------------------------------------------ @@ -1269,7 +1268,7 @@ void SceneCombiner::Copy(aiBone** _dest, const aiBone* src) { aiBone* dest = *_dest = new aiBone(); // get a flat copy - ::memcpy(dest,src,sizeof(aiBone)); + *dest = *src; // and reallocate all arrays GetArrayCopy( dest->mWeights, dest->mNumWeights ); @@ -1283,7 +1282,7 @@ void SceneCombiner::Copy (aiNode** _dest, const aiNode* src) aiNode* dest = *_dest = new aiNode(); // get a flat copy - ::memcpy(dest,src,sizeof(aiNode)); + *dest = *src; if (src->mMetaData) { Copy(&dest->mMetaData, src->mMetaData); diff --git a/code/Common/SpatialSort.cpp b/code/Common/SpatialSort.cpp index a32ff5f90..2bf6ce2e2 100644 --- a/code/Common/SpatialSort.cpp +++ b/code/Common/SpatialSort.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2020, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -50,71 +48,60 @@ using namespace Assimp; // CHAR_BIT seems to be defined under MVSC, but not under GCC. Pray that the correct value is 8. #ifndef CHAR_BIT -# define CHAR_BIT 8 +#define CHAR_BIT 8 #endif -#ifdef _WIN32 -# pragma warning(disable : 4127) -#endif // _WIN32 +const aiVector3D PlaneInit(0.8523f, 0.34321f, 0.5736f); // ------------------------------------------------------------------------------------------------ // Constructs a spatially sorted representation from the given position array. -SpatialSort::SpatialSort( const aiVector3D* pPositions, unsigned int pNumPositions, - unsigned int pElementOffset) - - // define the reference plane. We choose some arbitrary vector away from all basic axises - // in the hope that no model spreads all its vertices along this plane. - : mPlaneNormal(0.8523f, 0.34321f, 0.5736f) -{ +// define the reference plane. We choose some arbitrary vector away from all basic axises +// in the hope that no model spreads all its vertices along this plane. +SpatialSort::SpatialSort(const aiVector3D *pPositions, unsigned int pNumPositions, unsigned int pElementOffset) : + mPlaneNormal(PlaneInit) { mPlaneNormal.Normalize(); - Fill(pPositions,pNumPositions,pElementOffset); + Fill(pPositions, pNumPositions, pElementOffset); } // ------------------------------------------------------------------------------------------------ -SpatialSort :: SpatialSort() -: mPlaneNormal(0.8523f, 0.34321f, 0.5736f) -{ +SpatialSort::SpatialSort() : + mPlaneNormal(PlaneInit) { mPlaneNormal.Normalize(); } // ------------------------------------------------------------------------------------------------ // Destructor -SpatialSort::~SpatialSort() -{ - // nothing to do here, everything destructs automatically +SpatialSort::~SpatialSort() { + // empty } // ------------------------------------------------------------------------------------------------ -void SpatialSort::Fill( const aiVector3D* pPositions, unsigned int pNumPositions, - unsigned int pElementOffset, - bool pFinalize /*= true */) -{ +void SpatialSort::Fill(const aiVector3D *pPositions, unsigned int pNumPositions, + unsigned int pElementOffset, + bool pFinalize /*= true */) { mPositions.clear(); - Append(pPositions,pNumPositions,pElementOffset,pFinalize); + Append(pPositions, pNumPositions, pElementOffset, pFinalize); } // ------------------------------------------------------------------------------------------------ -void SpatialSort :: Finalize() -{ - std::sort( mPositions.begin(), mPositions.end()); +void SpatialSort::Finalize() { + std::sort(mPositions.begin(), mPositions.end()); } // ------------------------------------------------------------------------------------------------ -void SpatialSort::Append( const aiVector3D* pPositions, unsigned int pNumPositions, - unsigned int pElementOffset, - bool pFinalize /*= true */) -{ +void SpatialSort::Append(const aiVector3D *pPositions, unsigned int pNumPositions, + unsigned int pElementOffset, + bool pFinalize /*= true */) { // store references to all given positions along with their distance to the reference plane const size_t initial = mPositions.size(); - mPositions.reserve(initial + (pFinalize?pNumPositions:pNumPositions*2)); - for( unsigned int a = 0; a < pNumPositions; a++) - { - const char* tempPointer = reinterpret_cast (pPositions); - const aiVector3D* vec = reinterpret_cast (tempPointer + a * pElementOffset); + mPositions.reserve(initial + (pFinalize ? pNumPositions : pNumPositions * 2)); + for (unsigned int a = 0; a < pNumPositions; a++) { + const char *tempPointer = reinterpret_cast(pPositions); + const aiVector3D *vec = reinterpret_cast(tempPointer + a * pElementOffset); // store position by index and distance ai_real distance = *vec * mPlaneNormal; - mPositions.push_back( Entry( static_cast(a+initial), *vec, distance)); + mPositions.push_back(Entry(static_cast(a + initial), *vec, distance)); } if (pFinalize) { @@ -125,9 +112,8 @@ void SpatialSort::Append( const aiVector3D* pPositions, unsigned int pNumPositio // ------------------------------------------------------------------------------------------------ // Returns an iterator for all positions close to the given position. -void SpatialSort::FindPositions( const aiVector3D& pPosition, - ai_real pRadius, std::vector& poResults) const -{ +void SpatialSort::FindPositions(const aiVector3D &pPosition, + ai_real pRadius, std::vector &poResults) const { const ai_real dist = pPosition * mPlaneNormal; const ai_real minDist = dist - pRadius, maxDist = dist + pRadius; @@ -135,19 +121,18 @@ void SpatialSort::FindPositions( const aiVector3D& pPosition, poResults.clear(); // quick check for positions outside the range - if( mPositions.size() == 0) + if (mPositions.size() == 0) return; - if( maxDist < mPositions.front().mDistance) + if (maxDist < mPositions.front().mDistance) return; - if( minDist > mPositions.back().mDistance) + if (minDist > mPositions.back().mDistance) return; // do a binary search for the minimal distance to start the iteration there unsigned int index = (unsigned int)mPositions.size() / 2; unsigned int binaryStepSize = (unsigned int)mPositions.size() / 4; - while( binaryStepSize > 1) - { - if( mPositions[index].mDistance < minDist) + while (binaryStepSize > 1) { + if (mPositions[index].mDistance < minDist) index += binaryStepSize; else index -= binaryStepSize; @@ -157,21 +142,20 @@ void SpatialSort::FindPositions( const aiVector3D& pPosition, // depending on the direction of the last step we need to single step a bit back or forth // to find the actual beginning element of the range - while( index > 0 && mPositions[index].mDistance > minDist) + while (index > 0 && mPositions[index].mDistance > minDist) index--; - while( index < (mPositions.size() - 1) && mPositions[index].mDistance < minDist) + while (index < (mPositions.size() - 1) && mPositions[index].mDistance < minDist) index++; // Mow start iterating from there until the first position lays outside of the distance range. // Add all positions inside the distance range within the given radius to the result aray std::vector::const_iterator it = mPositions.begin() + index; - const ai_real pSquared = pRadius*pRadius; - while( it->mDistance < maxDist) - { - if( (it->mPosition - pPosition).SquareLength() < pSquared) - poResults.push_back( it->mIndex); + const ai_real pSquared = pRadius * pRadius; + while (it->mDistance < maxDist) { + if ((it->mPosition - pPosition).SquareLength() < pSquared) + poResults.push_back(it->mIndex); ++it; - if( it == mPositions.end()) + if (it == mPositions.end()) break; } @@ -180,70 +164,74 @@ void SpatialSort::FindPositions( const aiVector3D& pPosition, namespace { - // Binary, signed-integer representation of a single-precision floating-point value. - // IEEE 754 says: "If two floating-point numbers in the same format are ordered then they are - // ordered the same way when their bits are reinterpreted as sign-magnitude integers." - // This allows us to convert all floating-point numbers to signed integers of arbitrary size - // and then use them to work with ULPs (Units in the Last Place, for high-precision - // computations) or to compare them (integer comparisons are faster than floating-point - // comparisons on many platforms). - typedef ai_int BinFloat; +// Binary, signed-integer representation of a single-precision floating-point value. +// IEEE 754 says: "If two floating-point numbers in the same format are ordered then they are +// ordered the same way when their bits are reinterpreted as sign-magnitude integers." +// This allows us to convert all floating-point numbers to signed integers of arbitrary size +// and then use them to work with ULPs (Units in the Last Place, for high-precision +// computations) or to compare them (integer comparisons are faster than floating-point +// comparisons on many platforms). +typedef ai_int BinFloat; - // -------------------------------------------------------------------------------------------- - // Converts the bit pattern of a floating-point number to its signed integer representation. - BinFloat ToBinary( const ai_real & pValue) { +// -------------------------------------------------------------------------------------------- +// Converts the bit pattern of a floating-point number to its signed integer representation. +BinFloat ToBinary(const ai_real &pValue) { - // If this assertion fails, signed int is not big enough to store a float on your platform. - // Please correct the declaration of BinFloat a few lines above - but do it in a portable, - // #ifdef'd manner! - static_assert( sizeof(BinFloat) >= sizeof(ai_real), "sizeof(BinFloat) >= sizeof(ai_real)"); + // If this assertion fails, signed int is not big enough to store a float on your platform. + // Please correct the declaration of BinFloat a few lines above - but do it in a portable, + // #ifdef'd manner! + static_assert(sizeof(BinFloat) >= sizeof(ai_real), "sizeof(BinFloat) >= sizeof(ai_real)"); - #if defined( _MSC_VER) - // If this assertion fails, Visual C++ has finally moved to ILP64. This means that this - // code has just become legacy code! Find out the current value of _MSC_VER and modify - // the #if above so it evaluates false on the current and all upcoming VC versions (or - // on the current platform, if LP64 or LLP64 are still used on other platforms). - static_assert( sizeof(BinFloat) == sizeof(ai_real), "sizeof(BinFloat) == sizeof(ai_real)"); +#if defined(_MSC_VER) + // If this assertion fails, Visual C++ has finally moved to ILP64. This means that this + // code has just become legacy code! Find out the current value of _MSC_VER and modify + // the #if above so it evaluates false on the current and all upcoming VC versions (or + // on the current platform, if LP64 or LLP64 are still used on other platforms). + static_assert(sizeof(BinFloat) == sizeof(ai_real), "sizeof(BinFloat) == sizeof(ai_real)"); - // This works best on Visual C++, but other compilers have their problems with it. - const BinFloat binValue = reinterpret_cast(pValue); - #else - // On many compilers, reinterpreting a float address as an integer causes aliasing - // problems. This is an ugly but more or less safe way of doing it. - union { - ai_real asFloat; - BinFloat asBin; - } conversion; - conversion.asBin = 0; // zero empty space in case sizeof(BinFloat) > sizeof(float) - conversion.asFloat = pValue; - const BinFloat binValue = conversion.asBin; - #endif + // This works best on Visual C++, but other compilers have their problems with it. + const BinFloat binValue = reinterpret_cast(pValue); + //::memcpy(&binValue, &pValue, sizeof(pValue)); + //return binValue; +#else + // On many compilers, reinterpreting a float address as an integer causes aliasing + // problems. This is an ugly but more or less safe way of doing it. + union { + ai_real asFloat; + BinFloat asBin; + } conversion; + conversion.asBin = 0; // zero empty space in case sizeof(BinFloat) > sizeof(float) + conversion.asFloat = pValue; + const BinFloat binValue = conversion.asBin; +#endif - // floating-point numbers are of sign-magnitude format, so find out what signed number - // representation we must convert negative values to. - // See http://en.wikipedia.org/wiki/Signed_number_representations. + // floating-point numbers are of sign-magnitude format, so find out what signed number + // representation we must convert negative values to. + // See http://en.wikipedia.org/wiki/Signed_number_representations. - // Two's complement? - if( (-42 == (~42 + 1)) && (binValue & 0x80000000)) - return BinFloat(1 << (CHAR_BIT * sizeof(BinFloat) - 1)) - binValue; - // One's complement? - else if ( (-42 == ~42) && (binValue & 0x80000000)) - return BinFloat(-0) - binValue; - // Sign-magnitude? - else if( (-42 == (42 | (-0))) && (binValue & 0x80000000)) // -0 = 1000... binary - return binValue; - else - return binValue; - } + // Two's complement? + bool DefaultValue = ((-42 == (~42 + 1)) && (binValue & 0x80000000)); + bool OneComplement = ((-42 == ~42) && (binValue & 0x80000000)); + bool SignedMagnitude = ((-42 == (42 | (-0))) && (binValue & 0x80000000)); + + if (DefaultValue) + return BinFloat(1 << (CHAR_BIT * sizeof(BinFloat) - 1)) - binValue; + // One's complement? + else if (OneComplement) + return BinFloat(-0) - binValue; + // Sign-magnitude? + else if (SignedMagnitude) // -0 = 1000... binary + return binValue; + else + return binValue; +} } // namespace // ------------------------------------------------------------------------------------------------ // Fills an array with indices of all positions identical to the given position. In opposite to // FindPositions(), not an epsilon is used but a (very low) tolerance of four floating-point units. -void SpatialSort::FindIdenticalPositions( const aiVector3D& pPosition, - std::vector& poResults) const -{ +void SpatialSort::FindIdenticalPositions(const aiVector3D &pPosition, std::vector &poResults) const { // Epsilons have a huge disadvantage: they are of constant precision, while floating-point // values are of log2 precision. If you apply e=0.01 to 100, the epsilon is rather small, but // if you apply it to 0.001, it is enormous. @@ -269,20 +257,19 @@ void SpatialSort::FindIdenticalPositions( const aiVector3D& pPosition, // Convert the plane distance to its signed integer representation so the ULPs tolerance can be // applied. For some reason, VC won't optimize two calls of the bit pattern conversion. - const BinFloat minDistBinary = ToBinary( pPosition * mPlaneNormal) - distanceToleranceInULPs; + const BinFloat minDistBinary = ToBinary(pPosition * mPlaneNormal) - distanceToleranceInULPs; const BinFloat maxDistBinary = minDistBinary + 2 * distanceToleranceInULPs; // clear the array in this strange fashion because a simple clear() would also deallocate // the array which we want to avoid - poResults.resize( 0 ); + poResults.resize(0); // do a binary search for the minimal distance to start the iteration there unsigned int index = (unsigned int)mPositions.size() / 2; unsigned int binaryStepSize = (unsigned int)mPositions.size() / 4; - while( binaryStepSize > 1) - { + while (binaryStepSize > 1) { // Ugly, but conditional jumps are faster with integers than with floats - if( minDistBinary > ToBinary(mPositions[index].mDistance)) + if (minDistBinary > ToBinary(mPositions[index].mDistance)) index += binaryStepSize; else index -= binaryStepSize; @@ -292,20 +279,19 @@ void SpatialSort::FindIdenticalPositions( const aiVector3D& pPosition, // depending on the direction of the last step we need to single step a bit back or forth // to find the actual beginning element of the range - while( index > 0 && minDistBinary < ToBinary(mPositions[index].mDistance) ) + while (index > 0 && minDistBinary < ToBinary(mPositions[index].mDistance)) index--; - while( index < (mPositions.size() - 1) && minDistBinary > ToBinary(mPositions[index].mDistance)) + while (index < (mPositions.size() - 1) && minDistBinary > ToBinary(mPositions[index].mDistance)) index++; // Now start iterating from there until the first position lays outside of the distance range. // Add all positions inside the distance range within the tolerance to the result array std::vector::const_iterator it = mPositions.begin() + index; - while( ToBinary(it->mDistance) < maxDistBinary) - { - if( distance3DToleranceInULPs >= ToBinary((it->mPosition - pPosition).SquareLength())) + while (ToBinary(it->mDistance) < maxDistBinary) { + if (distance3DToleranceInULPs >= ToBinary((it->mPosition - pPosition).SquareLength())) poResults.push_back(it->mIndex); ++it; - if( it == mPositions.end()) + if (it == mPositions.end()) break; } @@ -313,22 +299,19 @@ void SpatialSort::FindIdenticalPositions( const aiVector3D& pPosition, } // ------------------------------------------------------------------------------------------------ -unsigned int SpatialSort::GenerateMappingTable(std::vector& fill, ai_real pRadius) const -{ - fill.resize(mPositions.size(),UINT_MAX); +unsigned int SpatialSort::GenerateMappingTable(std::vector &fill, ai_real pRadius) const { + fill.resize(mPositions.size(), UINT_MAX); ai_real dist, maxDist; - unsigned int t=0; - const ai_real pSquared = pRadius*pRadius; + unsigned int t = 0; + const ai_real pSquared = pRadius * pRadius; for (size_t i = 0; i < mPositions.size();) { dist = mPositions[i].mPosition * mPlaneNormal; maxDist = dist + pRadius; fill[mPositions[i].mIndex] = t; - const aiVector3D& oldpos = mPositions[i].mPosition; - for (++i; i < fill.size() && mPositions[i].mDistance < maxDist - && (mPositions[i].mPosition - oldpos).SquareLength() < pSquared; ++i) - { + const aiVector3D &oldpos = mPositions[i].mPosition; + for (++i; i < fill.size() && mPositions[i].mDistance < maxDist && (mPositions[i].mPosition - oldpos).SquareLength() < pSquared; ++i) { fill[mPositions[i].mIndex] = t; } ++t; @@ -338,7 +321,7 @@ unsigned int SpatialSort::GenerateMappingTable(std::vector& fill, // debug invariant: mPositions[i].mIndex values must range from 0 to mPositions.size()-1 for (size_t i = 0; i < fill.size(); ++i) { - ai_assert(fill[i] class basic_formatter; - typedef class basic_formatter< char, std::char_traits, std::allocator > format; -} + +template +class basic_formatter; + +typedef class basic_formatter, std::allocator> format; + +} // namespace Formatter // ------------------------------------------------------------------------------------------- -/** Load the Autodesk FBX file format. - - See http://en.wikipedia.org/wiki/FBX -*/ +/// Loads the Autodesk FBX file format. +/// +/// See http://en.wikipedia.org/wiki/FBX // ------------------------------------------------------------------------------------------- -class FBXImporter : public BaseImporter, public LogFunctions -{ +class FBXImporter : public BaseImporter, public LogFunctions { public: FBXImporter(); virtual ~FBXImporter(); // -------------------- - bool CanRead( const std::string& pFile, - IOSystem* pIOHandler, - bool checkSig - ) const; + bool CanRead(const std::string &pFile, + IOSystem *pIOHandler, + bool checkSig) const; protected: + // -------------------- + const aiImporterDesc *GetInfo() const; // -------------------- - const aiImporterDesc* GetInfo () const; + void SetupProperties(const Importer *pImp); // -------------------- - void SetupProperties(const Importer* pImp); - - // -------------------- - void InternReadFile( const std::string& pFile, - aiScene* pScene, - IOSystem* pIOHandler - ); + void InternReadFile(const std::string &pFile, + aiScene *pScene, + IOSystem *pIOHandler); private: FBX::ImportSettings settings; @@ -97,4 +95,3 @@ private: } // end of namespace Assimp #endif // !INCLUDED_AI_FBX_IMPORTER_H - diff --git a/code/Irr/IRRLoader.cpp b/code/Irr/IRRLoader.cpp index 4361d578a..f38ec367c 100644 --- a/code/Irr/IRRLoader.cpp +++ b/code/Irr/IRRLoader.cpp @@ -1483,6 +1483,7 @@ void IRRImporter::InternReadFile( const std::string& pFile, */ delete root; + delete reader; } #endif // !! ASSIMP_BUILD_NO_IRR_IMPORTER diff --git a/code/M3D/M3DExporter.cpp b/code/M3D/M3DExporter.cpp index 1ae6eb680..17ba24a44 100644 --- a/code/M3D/M3DExporter.cpp +++ b/code/M3D/M3DExporter.cpp @@ -189,42 +189,42 @@ M3D_INDEX addMaterial(const Assimp::M3DWrapper &m3d, const aiMaterial *mat) { continue; if (aiProps[k].pKey) { switch (m3d_propertytypes[k].format) { - case m3dpf_color: - if (mat->Get(aiProps[k].pKey, aiProps[k].type, - aiProps[k].index, c) == AI_SUCCESS) - addProp(&m3d->material[mi], - m3d_propertytypes[k].id, mkColor(&c)); - break; - case m3dpf_float: - if (mat->Get(aiProps[k].pKey, aiProps[k].type, - aiProps[k].index, f) == AI_SUCCESS) - addProp(&m3d->material[mi], - m3d_propertytypes[k].id, - /* not (uint32_t)f, because we don't want to convert + case m3dpf_color: + if (mat->Get(aiProps[k].pKey, aiProps[k].type, + aiProps[k].index, c) == AI_SUCCESS) + addProp(&m3d->material[mi], + m3d_propertytypes[k].id, mkColor(&c)); + break; + case m3dpf_float: + if (mat->Get(aiProps[k].pKey, aiProps[k].type, + aiProps[k].index, f) == AI_SUCCESS) + addProp(&m3d->material[mi], + m3d_propertytypes[k].id, + /* not (uint32_t)f, because we don't want to convert * it, we want to see it as 32 bits of memory */ - *((uint32_t *)&f)); - break; - case m3dpf_uint8: - if (mat->Get(aiProps[k].pKey, aiProps[k].type, - aiProps[k].index, j) == AI_SUCCESS) { - // special conversion for illumination model property - if (m3d_propertytypes[k].id == m3dp_il) { - switch (j) { - case aiShadingMode_NoShading: j = 0; break; - case aiShadingMode_Phong: j = 2; break; - default: j = 1; break; - } + *((uint32_t *)&f)); + break; + case m3dpf_uint8: + if (mat->Get(aiProps[k].pKey, aiProps[k].type, + aiProps[k].index, j) == AI_SUCCESS) { + // special conversion for illumination model property + if (m3d_propertytypes[k].id == m3dp_il) { + switch (j) { + case aiShadingMode_NoShading: j = 0; break; + case aiShadingMode_Phong: j = 2; break; + default: j = 1; break; } - addProp(&m3d->material[mi], - m3d_propertytypes[k].id, j); } - break; - default: - if (mat->Get(aiProps[k].pKey, aiProps[k].type, - aiProps[k].index, j) == AI_SUCCESS) - addProp(&m3d->material[mi], - m3d_propertytypes[k].id, j); - break; + addProp(&m3d->material[mi], + m3d_propertytypes[k].id, j); + } + break; + default: + if (mat->Get(aiProps[k].pKey, aiProps[k].type, + aiProps[k].index, j) == AI_SUCCESS) + addProp(&m3d->material[mi], + m3d_propertytypes[k].id, j); + break; } } if (aiTxProps[k].pKey && @@ -292,8 +292,8 @@ void ExportSceneM3D( // Prototyped and registered in Exporter.cpp void ExportSceneM3DA( const char *, - IOSystem*, - const aiScene*, + IOSystem *, + const aiScene *, const ExportProperties * ) { @@ -312,7 +312,9 @@ void ExportSceneM3DA( M3DExporter::M3DExporter(const aiScene *pScene, const ExportProperties *pProperties) : mScene(pScene), mProperties(pProperties), - outfile() {} + outfile() { + // empty +} // ------------------------------------------------------------------------------------------------ void M3DExporter::doExport( @@ -352,6 +354,9 @@ void M3DExporter::doExport( // explicitly release file pointer, // so we don't have to rely on class destruction. outfile.reset(); + + M3D_FREE(m3d->name); + m3d->name = nullptr; } // ------------------------------------------------------------------------------------------------ diff --git a/code/M3D/M3DWrapper.cpp b/code/M3D/M3DWrapper.cpp index eca8af75f..98792217f 100644 --- a/code/M3D/M3DWrapper.cpp +++ b/code/M3D/M3DWrapper.cpp @@ -50,15 +50,15 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifdef ASSIMP_USE_M3D_READFILECB -# if (__cplusplus >= 201103L) || !defined(_MSC_VER) || (_MSC_VER >= 1900) // C++11 and MSVC 2015 onwards -# define threadlocal thread_local -# else -# if defined(_MSC_VER) && (_MSC_VER >= 1800) // there's an alternative for MSVC 2013 -# define threadlocal __declspec(thread) -# else -# define threadlocal -# endif -# endif +#if (__cplusplus >= 201103L) || !defined(_MSC_VER) || (_MSC_VER >= 1900) // C++11 and MSVC 2015 onwards +#define threadlocal thread_local +#else +#if defined(_MSC_VER) && (_MSC_VER >= 1800) // there's an alternative for MSVC 2013 +#define threadlocal __declspec(thread) +#else +#define threadlocal +#endif +#endif extern "C" { @@ -66,37 +66,37 @@ extern "C" { threadlocal void *m3dimporter_pIOHandler; unsigned char *m3dimporter_readfile(char *fn, unsigned int *size) { - ai_assert(nullptr != fn); - ai_assert(nullptr != size); - std::string file(fn); - std::unique_ptr pStream( - (reinterpret_cast(m3dimporter_pIOHandler))->Open(file, "rb")); - size_t fileSize = 0; - unsigned char *data = NULL; - // sometimes pStream is nullptr in a single-threaded scenario too for some reason - // (should be an empty object returning nothing I guess) - if (pStream) { - fileSize = pStream->FileSize(); - // should be allocated with malloc(), because the library will call free() to deallocate - data = (unsigned char *)malloc(fileSize); - if (!data || !pStream.get() || !fileSize || fileSize != pStream->Read(data, 1, fileSize)) { - pStream.reset(); - *size = 0; - // don't throw a deadly exception, it's not fatal if we can't read an external asset - return nullptr; - } - pStream.reset(); - } - *size = (int)fileSize; - return data; + ai_assert(nullptr != fn); + ai_assert(nullptr != size); + std::string file(fn); + std::unique_ptr pStream( + (reinterpret_cast(m3dimporter_pIOHandler))->Open(file, "rb")); + size_t fileSize = 0; + unsigned char *data = NULL; + // sometimes pStream is nullptr in a single-threaded scenario too for some reason + // (should be an empty object returning nothing I guess) + if (pStream) { + fileSize = pStream->FileSize(); + // should be allocated with malloc(), because the library will call free() to deallocate + data = (unsigned char *)malloc(fileSize); + if (!data || !pStream.get() || !fileSize || fileSize != pStream->Read(data, 1, fileSize)) { + pStream.reset(); + *size = 0; + // don't throw a deadly exception, it's not fatal if we can't read an external asset + return nullptr; + } + pStream.reset(); + } + *size = (int)fileSize; + return data; } } #endif namespace Assimp { M3DWrapper::M3DWrapper() { - // use malloc() here because m3d_free() will call free() - m3d_ = (m3d_t *)calloc(1, sizeof(m3d_t)); + // use malloc() here because m3d_free() will call free() + m3d_ = (m3d_t *)calloc(1, sizeof(m3d_t)); } M3DWrapper::M3DWrapper(IOSystem *pIOHandler, const std::vector &buffer) { @@ -105,41 +105,42 @@ M3DWrapper::M3DWrapper(IOSystem *pIOHandler, const std::vector &b } #ifdef ASSIMP_USE_M3D_READFILECB - // pass this IOHandler to the C callback in a thread-local pointer - m3dimporter_pIOHandler = pIOHandler; - m3d_ = m3d_load(const_cast(buffer.data()), m3dimporter_readfile, free, nullptr); - // Clear the C callback - m3dimporter_pIOHandler = nullptr; + // pass this IOHandler to the C callback in a thread-local pointer + m3dimporter_pIOHandler = pIOHandler; + m3d_ = m3d_load(const_cast(buffer.data()), m3dimporter_readfile, free, nullptr); + // Clear the C callback + m3dimporter_pIOHandler = nullptr; #else - m3d_ = m3d_load(const_cast(buffer.data()), nullptr, nullptr, nullptr); + m3d_ = m3d_load(const_cast(buffer.data()), nullptr, nullptr, nullptr); #endif } M3DWrapper::~M3DWrapper() { - reset(); + reset(); } void M3DWrapper::reset() { - ClearSave(); - if (m3d_) - m3d_free(m3d_); - m3d_ = nullptr; + ClearSave(); + if (m3d_) { + m3d_free(m3d_); + } + m3d_ = nullptr; } unsigned char *M3DWrapper::Save(int quality, int flags, unsigned int &size) { #if (!(ASSIMP_BUILD_NO_EXPORT || ASSIMP_BUILD_NO_M3D_EXPORTER)) - ClearSave(); - saved_output_ = m3d_save(m3d_, quality, flags, &size); - return saved_output_; + ClearSave(); + saved_output_ = m3d_save(m3d_, quality, flags, &size); + return saved_output_; #else - return nullptr; + return nullptr; #endif } void M3DWrapper::ClearSave() { - if (saved_output_) - M3D_FREE(saved_output_); - saved_output_ = nullptr; + if (saved_output_) + M3D_FREE(saved_output_); + saved_output_ = nullptr; } } // namespace Assimp diff --git a/code/M3D/m3d.h b/code/M3D/m3d.h index ef363d2dd..75bcdfeb7 100644 --- a/code/M3D/m3d.h +++ b/code/M3D/m3d.h @@ -1556,7 +1556,7 @@ static int _m3dstbi__create_png_image(_m3dstbi__png *a, unsigned char *image_dat return 1; } -static int _m3dstbi__compute_transparency(_m3dstbi__png *z, unsigned char tc[3], int out_n) { +static int _m3dstbi__compute_transparency(_m3dstbi__png *z, unsigned char* tc, int out_n) { _m3dstbi__context *s = z->s; _m3dstbi__uint32 i, pixel_count = s->img_x * s->img_y; unsigned char *p = z->out; @@ -1639,7 +1639,7 @@ static int _m3dstbi__expand_png_palette(_m3dstbi__png *a, unsigned char *palette static int _m3dstbi__parse_png_file(_m3dstbi__png *z, int scan, int req_comp) { unsigned char palette[1024], pal_img_n = 0; - unsigned char has_trans = 0, tc[3]; + unsigned char has_trans = 0, tc[3] = {}; _m3dstbi__uint16 tc16[3]; _m3dstbi__uint32 ioff = 0, idata_limit = 0, i, pal_len = 0; int first = 1, k, interlace = 0, color = 0; @@ -4350,7 +4350,7 @@ unsigned char *m3d_save(m3d_t *model, int quality, int flags, unsigned int *size M3D_INDEX last, *vrtxidx = NULL, *mtrlidx = NULL, *tmapidx = NULL, *skinidx = NULL; uint32_t idx, numcmap = 0, *cmap = NULL, numvrtx = 0, maxvrtx = 0, numtmap = 0, maxtmap = 0, numproc = 0; uint32_t numskin = 0, maxskin = 0, numstr = 0, maxt = 0, maxbone = 0, numgrp = 0, maxgrp = 0, *grpidx = NULL; - uint8_t *opa; + uint8_t *opa = nullptr; m3dcd_t *cd; m3dc_t *cmd; m3dstr_t *str = NULL; @@ -5440,13 +5440,13 @@ unsigned char *m3d_save(m3d_t *model, int quality, int flags, unsigned int *size out += 2; break; case 4: - *((float *)out) = vrtx[i].data.x; + memcpy(out, &vrtx[i].data.x, sizeof(float)); out += 4; - *((float *)out) = vrtx[i].data.y; + memcpy(out, &vrtx[i].data.y, sizeof(float)); out += 4; - *((float *)out) = vrtx[i].data.z; + memcpy(out, &vrtx[i].data.z, sizeof(float)); out += 4; - *((float *)out) = vrtx[i].data.w; + memcpy(out, &vrtx[i].data.w, sizeof(float)); out += 4; break; case 8: @@ -5474,9 +5474,11 @@ unsigned char *m3d_save(m3d_t *model, int quality, int flags, unsigned int *size } out = _m3d_addidx(out, sk_s, vrtx[i].data.skinid); } - *length = (uint32_t)((uintptr_t)out - (uintptr_t)((uint8_t *)h + len)); + uint32_t v = (uint32_t)((uintptr_t)out - (uintptr_t)((uint8_t *)h + len)); + memcpy(length, &v, sizeof(uint32_t)); + //*length = (uint32_t)((uintptr_t)out - (uintptr_t)((uint8_t *)h + len)); out = NULL; - len += *length; + len += v; } /* bones chunk */ if (model->numbone && model->bone && !(flags & M3D_EXP_NOBONE)) { @@ -5660,8 +5662,9 @@ unsigned char *m3d_save(m3d_t *model, int quality, int flags, unsigned int *size out = _m3d_addidx(out, vi_s, vrtxidx[face[i].data.normal[j]]); } } - *length = (uint32_t)((uintptr_t)out - (uintptr_t)((uint8_t *)h + len)); - len += *length; + uint32_t v = (uint32_t)((uintptr_t)out - (uintptr_t)((uint8_t *)h + len)); + memcpy(length, &v, sizeof(uint32_t)); + len += v; out = NULL; } /* mathematical shapes face */ @@ -5721,8 +5724,9 @@ unsigned char *m3d_save(m3d_t *model, int quality, int flags, unsigned int *size } } } - *length = (uint32_t)((uintptr_t)out - (uintptr_t)((uint8_t *)h + len)); - len += *length; + uint32_t v = (uint32_t)((uintptr_t)out - (uintptr_t)((uint8_t *)h + len)); + memcpy( length, &v, sizeof(uint32_t)); + len += v; out = NULL; } } @@ -5765,8 +5769,9 @@ unsigned char *m3d_save(m3d_t *model, int quality, int flags, unsigned int *size out = _m3d_addidx(out, si_s, _m3d_stridx(str, numstr, model->label[l].text)); } if (length) { - *length = (uint32_t)((uintptr_t)out - (uintptr_t)((uint8_t *)h + len)); - len += *length; + uint32_t v = (uint32_t)((uintptr_t)out - (uintptr_t)((uint8_t *)h + len)); + memcpy( length, &v, sizeof(uint32_t)); + len += v; } out = NULL; sn = sl = NULL; @@ -5796,8 +5801,9 @@ unsigned char *m3d_save(m3d_t *model, int quality, int flags, unsigned int *size out = _m3d_addidx(out, vi_s, vrtxidx[a->frame[i].transform[k].ori]); } } - *length = (uint32_t)((uintptr_t)out - (uintptr_t)((uint8_t *)h + len)); - len += *length; + uint32_t v = (uint32_t)((uintptr_t)out - (uintptr_t)((uint8_t *)h + len)); + memcpy( length, &v, sizeof(uint32_t)); + len += v; out = NULL; } } diff --git a/code/Material/MaterialSystem.cpp b/code/Material/MaterialSystem.cpp index 0435f029e..f75fa0126 100644 --- a/code/Material/MaterialSystem.cpp +++ b/code/Material/MaterialSystem.cpp @@ -503,7 +503,7 @@ aiReturn aiMaterial::AddBinaryProperty (const void* pInput, pcNew->mData = new char[pSizeInBytes]; memcpy (pcNew->mData,pInput,pSizeInBytes); - pcNew->mKey.length = (ai_uint32)::strlen(pKey); + pcNew->mKey.length = static_cast( ::strlen(pKey) ); ai_assert ( MAXLEN > pcNew->mKey.length); strcpy( pcNew->mKey.data, pKey ); diff --git a/code/PostProcessing/LimitBoneWeightsProcess.cpp b/code/PostProcessing/LimitBoneWeightsProcess.cpp index 1f1abfabb..5b8934159 100644 --- a/code/PostProcessing/LimitBoneWeightsProcess.cpp +++ b/code/PostProcessing/LimitBoneWeightsProcess.cpp @@ -44,6 +44,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "LimitBoneWeightsProcess.h" +#include #include #include #include @@ -52,7 +53,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using namespace Assimp; - // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer LimitBoneWeightsProcess::LimitBoneWeightsProcess() @@ -76,10 +76,12 @@ bool LimitBoneWeightsProcess::IsActive( unsigned int pFlags) const // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. -void LimitBoneWeightsProcess::Execute( aiScene* pScene) { +void LimitBoneWeightsProcess::Execute( aiScene* pScene) +{ ASSIMP_LOG_DEBUG("LimitBoneWeightsProcess begin"); - for (unsigned int a = 0; a < pScene->mNumMeshes; ++a ) { - ProcessMesh(pScene->mMeshes[a]); + + for (unsigned int m = 0; m < pScene->mNumMeshes; ++m) { + ProcessMesh(pScene->mMeshes[m]); } ASSIMP_LOG_DEBUG("LimitBoneWeightsProcess end"); @@ -95,107 +97,96 @@ void LimitBoneWeightsProcess::SetupProperties(const Importer* pImp) // ------------------------------------------------------------------------------------------------ // Unites identical vertices in the given mesh -void LimitBoneWeightsProcess::ProcessMesh( aiMesh* pMesh) +void LimitBoneWeightsProcess::ProcessMesh(aiMesh* pMesh) { - if( !pMesh->HasBones()) + if (!pMesh->HasBones()) return; // collect all bone weights per vertex - typedef std::vector< std::vector< Weight > > WeightsPerVertex; - WeightsPerVertex vertexWeights( pMesh->mNumVertices); + typedef SmallVector VertexWeightArray; + typedef std::vector WeightsPerVertex; + WeightsPerVertex vertexWeights(pMesh->mNumVertices); + size_t maxVertexWeights = 0; - // collect all weights per vertex - for( unsigned int a = 0; a < pMesh->mNumBones; a++) + for (unsigned int b = 0; b < pMesh->mNumBones; ++b) { - const aiBone* bone = pMesh->mBones[a]; - for( unsigned int b = 0; b < bone->mNumWeights; b++) + const aiBone* bone = pMesh->mBones[b]; + for (unsigned int w = 0; w < bone->mNumWeights; ++w) { - const aiVertexWeight& w = bone->mWeights[b]; - vertexWeights[w.mVertexId].push_back( Weight( a, w.mWeight)); + const aiVertexWeight& vw = bone->mWeights[w]; + vertexWeights[vw.mVertexId].push_back(Weight(b, vw.mWeight)); + maxVertexWeights = std::max(maxVertexWeights, vertexWeights[vw.mVertexId].size()); } } + if (maxVertexWeights <= mMaxWeights) + return; + unsigned int removed = 0, old_bones = pMesh->mNumBones; // now cut the weight count if it exceeds the maximum - bool bChanged = false; - for( WeightsPerVertex::iterator vit = vertexWeights.begin(); vit != vertexWeights.end(); ++vit) + for (WeightsPerVertex::iterator vit = vertexWeights.begin(); vit != vertexWeights.end(); ++vit) { - if( vit->size() <= mMaxWeights) + if (vit->size() <= mMaxWeights) continue; - bChanged = true; - // more than the defined maximum -> first sort by weight in descending order. That's // why we defined the < operator in such a weird way. - std::sort( vit->begin(), vit->end()); + std::sort(vit->begin(), vit->end()); // now kill everything beyond the maximum count unsigned int m = static_cast(vit->size()); - vit->erase( vit->begin() + mMaxWeights, vit->end()); - removed += static_cast(m-vit->size()); + vit->resize(mMaxWeights); + removed += static_cast(m - vit->size()); // and renormalize the weights float sum = 0.0f; - for( std::vector::const_iterator it = vit->begin(); it != vit->end(); ++it ) { + for(const Weight* it = vit->begin(); it != vit->end(); ++it) { sum += it->mWeight; } - if( 0.0f != sum ) { + if (0.0f != sum) { const float invSum = 1.0f / sum; - for( std::vector::iterator it = vit->begin(); it != vit->end(); ++it ) { + for(Weight* it = vit->begin(); it != vit->end(); ++it) { it->mWeight *= invSum; } } } - if (bChanged) { - // rebuild the vertex weight array for all bones - typedef std::vector< std::vector< aiVertexWeight > > WeightsPerBone; - WeightsPerBone boneWeights( pMesh->mNumBones); - for( unsigned int a = 0; a < vertexWeights.size(); a++) + // clear weight count for all bone + for (unsigned int a = 0; a < pMesh->mNumBones; ++a) + { + pMesh->mBones[a]->mNumWeights = 0; + } + + // rebuild the vertex weight array for all bones + for (unsigned int a = 0; a < vertexWeights.size(); ++a) + { + const VertexWeightArray& vw = vertexWeights[a]; + for (const Weight* it = vw.begin(); it != vw.end(); ++it) { - const std::vector& vw = vertexWeights[a]; - for( std::vector::const_iterator it = vw.begin(); it != vw.end(); ++it) - boneWeights[it->mBone].push_back( aiVertexWeight( a, it->mWeight)); - } - - // and finally copy the vertex weight list over to the mesh's bones - std::vector abNoNeed(pMesh->mNumBones,false); - bChanged = false; - - for( unsigned int a = 0; a < pMesh->mNumBones; a++) - { - const std::vector& bw = boneWeights[a]; - aiBone* bone = pMesh->mBones[a]; - - if ( bw.empty() ) - { - abNoNeed[a] = bChanged = true; - continue; - } - - // copy the weight list. should always be less weights than before, so we don't need a new allocation - ai_assert( bw.size() <= bone->mNumWeights); - bone->mNumWeights = static_cast( bw.size() ); - ::memcpy( bone->mWeights, &bw[0], bw.size() * sizeof( aiVertexWeight)); - } - - if (bChanged) { - // the number of new bones is smaller than before, so we can reuse the old array - aiBone** ppcCur = pMesh->mBones;aiBone** ppcSrc = ppcCur; - - for (std::vector::const_iterator iter = abNoNeed.begin();iter != abNoNeed.end() ;++iter) { - if (*iter) { - delete *ppcSrc; - --pMesh->mNumBones; - } - else *ppcCur++ = *ppcSrc; - ++ppcSrc; - } - } - - if (!DefaultLogger::isNullLogger()) { - ASSIMP_LOG_INFO_F("Removed ", removed, " weights. Input bones: ", old_bones, ". Output bones: ", pMesh->mNumBones ); + aiBone* bone = pMesh->mBones[it->mBone]; + bone->mWeights[bone->mNumWeights++] = aiVertexWeight(a, it->mWeight); } } + + // remove empty bones + unsigned int writeBone = 0; + + for (unsigned int readBone = 0; readBone< pMesh->mNumBones; ++readBone) + { + aiBone* bone = pMesh->mBones[readBone]; + if (bone->mNumWeights > 0) + { + pMesh->mBones[writeBone++] = bone; + } + else + { + delete bone; + } + } + pMesh->mNumBones = writeBone; + + if (!DefaultLogger::isNullLogger()) { + ASSIMP_LOG_INFO_F("Removed ", removed, " weights. Input bones: ", old_bones, ". Output bones: ", pMesh->mNumBones); + } } diff --git a/code/Q3BSP/Q3BSPFileImporter.cpp b/code/Q3BSP/Q3BSPFileImporter.cpp index 480432606..131e61534 100644 --- a/code/Q3BSP/Q3BSPFileImporter.cpp +++ b/code/Q3BSP/Q3BSPFileImporter.cpp @@ -617,7 +617,7 @@ bool Q3BSPFileImporter::importTextureFromArchive( const Q3BSP::Q3BSPModel *model // We'll leave it up to the user to figure out which extension the file has. aiString name; strncpy( name.data, pTexture->strName, sizeof name.data ); - name.length = (ai_uint32)strlen( name.data ); + name.length = static_cast(strlen( name.data )); pMatHelper->AddProperty( &name, AI_MATKEY_TEXTURE_DIFFUSE( 0 ) ); } } diff --git a/code/SMD/SMDLoader.cpp b/code/SMD/SMDLoader.cpp index d3b625036..2d9d677a7 100644 --- a/code/SMD/SMDLoader.cpp +++ b/code/SMD/SMDLoader.cpp @@ -616,7 +616,7 @@ void SMDImporter::CreateOutputMaterials() { if (aszTextures[iMat].length()) { ::strncpy(szName.data, aszTextures[iMat].c_str(),MAXLEN-1); - szName.length = (ai_uint32)aszTextures[iMat].length(); + szName.length = static_cast( aszTextures[iMat].length() ); pcMat->AddProperty(&szName,AI_MATKEY_TEXTURE_DIFFUSE(0)); } } diff --git a/code/Terragen/TerragenLoader.cpp b/code/Terragen/TerragenLoader.cpp index 6ab7ac1cd..5f25c2455 100644 --- a/code/Terragen/TerragenLoader.cpp +++ b/code/Terragen/TerragenLoader.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2020, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -43,17 +41,15 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @file Implementation of the Terragen importer class */ - - #ifndef ASSIMP_BUILD_NO_TERRAGEN_IMPORTER #include "TerragenLoader.h" #include -#include -#include +#include #include #include -#include +#include +#include using namespace Assimp; @@ -72,78 +68,72 @@ static const aiImporterDesc desc = { // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer -TerragenImporter::TerragenImporter() -: configComputeUVs (false) -{} +TerragenImporter::TerragenImporter() : + configComputeUVs(false) {} // ------------------------------------------------------------------------------------------------ // Destructor, private as well -TerragenImporter::~TerragenImporter() -{} +TerragenImporter::~TerragenImporter() {} // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool TerragenImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const -{ +bool TerragenImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool checkSig) const { // check file extension std::string extension = GetExtension(pFile); - if( extension == "ter") + if (extension == "ter") return true; - if( !extension.length() || checkSig) { + if (!extension.length() || checkSig) { /* If CanRead() is called in order to check whether we * support a specific file extension in general pIOHandler * might be NULL and it's our duty to return true here. */ - if (!pIOHandler)return true; - const char* tokens[] = {"terragen"}; - return SearchFileHeaderForToken(pIOHandler,pFile,tokens,1); + if (!pIOHandler) return true; + const char *tokens[] = { "terragen" }; + return SearchFileHeaderForToken(pIOHandler, pFile, tokens, 1); } return false; } // ------------------------------------------------------------------------------------------------ // Build a string of all file extensions supported -const aiImporterDesc* TerragenImporter::GetInfo () const -{ +const aiImporterDesc *TerragenImporter::GetInfo() const { return &desc; } // ------------------------------------------------------------------------------------------------ // Setup import properties -void TerragenImporter::SetupProperties(const Importer* pImp) -{ +void TerragenImporter::SetupProperties(const Importer *pImp) { // AI_CONFIG_IMPORT_TER_MAKE_UVS - configComputeUVs = ( 0 != pImp->GetPropertyInteger(AI_CONFIG_IMPORT_TER_MAKE_UVS,0) ); + configComputeUVs = (0 != pImp->GetPropertyInteger(AI_CONFIG_IMPORT_TER_MAKE_UVS, 0)); } // ------------------------------------------------------------------------------------------------ // Imports the given file into the given scene structure. -void TerragenImporter::InternReadFile( const std::string& pFile, - aiScene* pScene, IOSystem* pIOHandler) -{ - IOStream* file = pIOHandler->Open( pFile, "rb"); +void TerragenImporter::InternReadFile(const std::string &pFile, + aiScene *pScene, IOSystem *pIOHandler) { + IOStream *file = pIOHandler->Open(pFile, "rb"); // Check whether we can read from the file - if( file == NULL) - throw DeadlyImportError( "Failed to open TERRAGEN TERRAIN file " + pFile + "."); + if (file == NULL) + throw DeadlyImportError("Failed to open TERRAGEN TERRAIN file " + pFile + "."); // Construct a stream reader to read all data in the correct endianness StreamReaderLE reader(file); - if(reader.GetRemainingSize() < 16) - throw DeadlyImportError( "TER: file is too small" ); + if (reader.GetRemainingSize() < 16) + throw DeadlyImportError("TER: file is too small"); // Check for the existence of the two magic strings 'TERRAGEN' and 'TERRAIN ' - if (::strncmp((const char*)reader.GetPtr(),AI_TERR_BASE_STRING,8)) - throw DeadlyImportError( "TER: Magic string \'TERRAGEN\' not found" ); + if (::strncmp((const char *)reader.GetPtr(), AI_TERR_BASE_STRING, 8)) + throw DeadlyImportError("TER: Magic string \'TERRAGEN\' not found"); - if (::strncmp((const char*)reader.GetPtr()+8,AI_TERR_TERRAIN_STRING,8)) - throw DeadlyImportError( "TER: Magic string \'TERRAIN\' not found" ); + if (::strncmp((const char *)reader.GetPtr() + 8, AI_TERR_TERRAIN_STRING, 8)) + throw DeadlyImportError("TER: Magic string \'TERRAIN\' not found"); - unsigned int x = 0,y = 0,mode = 0; + unsigned int x = 0, y = 0, mode = 0; - aiNode* root = pScene->mRootNode = new aiNode(); + aiNode *root = pScene->mRootNode = new aiNode(); root->mName.Set(""); // Default scaling is 30 @@ -151,104 +141,98 @@ void TerragenImporter::InternReadFile( const std::string& pFile, // Now read all chunks until we're finished or an EOF marker is encountered reader.IncPtr(16); - while (reader.GetRemainingSize() >= 4) - { - const char* head = (const char*)reader.GetPtr(); + while (reader.GetRemainingSize() >= 4) { + const char *head = (const char *)reader.GetPtr(); reader.IncPtr(4); // EOF, break in every case - if (!::strncmp(head,AI_TERR_EOF_STRING,4)) + if (!::strncmp(head, AI_TERR_EOF_STRING, 4)) break; // Number of x-data points - if (!::strncmp(head,AI_TERR_CHUNK_XPTS,4)) - { + if (!::strncmp(head, AI_TERR_CHUNK_XPTS, 4)) { x = (uint16_t)reader.GetI2(); } // Number of y-data points - else if (!::strncmp(head,AI_TERR_CHUNK_YPTS,4)) - { + else if (!::strncmp(head, AI_TERR_CHUNK_YPTS, 4)) { y = (uint16_t)reader.GetI2(); } // Squared terrains width-1. - else if (!::strncmp(head,AI_TERR_CHUNK_SIZE,4)) - { - x = y = (uint16_t)reader.GetI2()+1; + else if (!::strncmp(head, AI_TERR_CHUNK_SIZE, 4)) { + x = y = (uint16_t)reader.GetI2() + 1; } // terrain scaling - else if (!::strncmp(head,AI_TERR_CHUNK_SCAL,4)) - { + else if (!::strncmp(head, AI_TERR_CHUNK_SCAL, 4)) { root->mTransformation.a1 = reader.GetF4(); root->mTransformation.b2 = reader.GetF4(); root->mTransformation.c3 = reader.GetF4(); } // mapping == 1: earth radius - else if (!::strncmp(head,AI_TERR_CHUNK_CRAD,4)) - { + else if (!::strncmp(head, AI_TERR_CHUNK_CRAD, 4)) { reader.GetF4(); } // mapping mode - else if (!::strncmp(head,AI_TERR_CHUNK_CRVM,4)) - { + else if (!::strncmp(head, AI_TERR_CHUNK_CRVM, 4)) { mode = reader.GetI1(); if (0 != mode) ASSIMP_LOG_ERROR("TER: Unsupported mapping mode, a flat terrain is returned"); } // actual terrain data - else if (!::strncmp(head,AI_TERR_CHUNK_ALTW,4)) - { - float hscale = (float)reader.GetI2() / 65536; + else if (!::strncmp(head, AI_TERR_CHUNK_ALTW, 4)) { + float hscale = (float)reader.GetI2() / 65536; float bheight = (float)reader.GetI2(); - if (!hscale)hscale = 1; + if (!hscale) hscale = 1; // Ensure we have enough data - if (reader.GetRemainingSize() < x*y*2) + if (reader.GetRemainingSize() < x * y * 2) throw DeadlyImportError("TER: ALTW chunk is too small"); if (x <= 1 || y <= 1) throw DeadlyImportError("TER: Invalid terrain size"); // Allocate the output mesh - pScene->mMeshes = new aiMesh*[pScene->mNumMeshes = 1]; - aiMesh* m = pScene->mMeshes[0] = new aiMesh(); + pScene->mMeshes = new aiMesh *[pScene->mNumMeshes = 1]; + aiMesh *m = pScene->mMeshes[0] = new aiMesh(); // We return quads - aiFace* f = m->mFaces = new aiFace[m->mNumFaces = (x-1)*(y-1)]; - aiVector3D* pv = m->mVertices = new aiVector3D[m->mNumVertices = m->mNumFaces*4]; + aiFace *f = m->mFaces = new aiFace[m->mNumFaces = (x - 1) * (y - 1)]; + aiVector3D *pv = m->mVertices = new aiVector3D[m->mNumVertices = m->mNumFaces * 4]; - aiVector3D *uv( NULL ); - float step_y( 0.0f ), step_x( 0.0f ); + aiVector3D *uv(NULL); + float step_y(0.0f), step_x(0.0f); if (configComputeUVs) { uv = m->mTextureCoords[0] = new aiVector3D[m->mNumVertices]; - step_y = 1.f/y; - step_x = 1.f/x; + step_y = 1.f / y; + step_x = 1.f / x; } - const int16_t* data = (const int16_t*)reader.GetPtr(); + const int16_t *data = (const int16_t *)reader.GetPtr(); - for (unsigned int yy = 0, t = 0; yy < y-1;++yy) { - for (unsigned int xx = 0; xx < x-1;++xx,++f) { + for (unsigned int yy = 0, t = 0; yy < y - 1; ++yy) { + for (unsigned int xx = 0; xx < x - 1; ++xx, ++f) { // make verts const float fy = (float)yy, fx = (float)xx; - unsigned tmp,tmp2; - *pv++ = aiVector3D(fx,fy, (float)data[(tmp2=x*yy) + xx] * hscale + bheight); - *pv++ = aiVector3D(fx,fy+1, (float)data[(tmp=x*(yy+1)) + xx] * hscale + bheight); - *pv++ = aiVector3D(fx+1,fy+1,(float)data[tmp + xx+1] * hscale + bheight); - *pv++ = aiVector3D(fx+1,fy, (float)data[tmp2 + xx+1] * hscale + bheight); + unsigned tmp, tmp2; + *pv++ = aiVector3D(fx, fy, (float)data[(tmp2 = x * yy) + xx] * hscale + bheight); + *pv++ = aiVector3D(fx, fy + 1, (float)data[(tmp = x * (yy + 1)) + xx] * hscale + bheight); + *pv++ = aiVector3D(fx + 1, fy + 1, (float)data[tmp + xx + 1] * hscale + bheight); + *pv++ = aiVector3D(fx + 1, fy, (float)data[tmp2 + xx + 1] * hscale + bheight); // also make texture coordinates, if necessary if (configComputeUVs) { - *uv++ = aiVector3D( step_x*xx, step_y*yy, 0.f ); - *uv++ = aiVector3D( step_x*xx, step_y*(yy+1), 0.f ); - *uv++ = aiVector3D( step_x*(xx+1), step_y*(yy+1), 0.f ); - *uv++ = aiVector3D( step_x*(xx+1), step_y*yy, 0.f ); + *uv++ = aiVector3D(step_x * xx, step_y * yy, 0.f); + *uv++ = aiVector3D(step_x * xx, step_y * (yy + 1), 0.f); + *uv++ = aiVector3D(step_x * (xx + 1), step_y * (yy + 1), 0.f); + *uv++ = aiVector3D(step_x * (xx + 1), step_y * yy, 0.f); } // make indices f->mIndices = new unsigned int[f->mNumIndices = 4]; - for (unsigned int i = 0; i < 4;++i) - f->mIndices[i] = t++; + for (unsigned int i = 0; i < 4; ++i) { + f->mIndices[i] = t; + t++; + } } } diff --git a/code/Terragen/TerragenLoader.h b/code/Terragen/TerragenLoader.h index 81823fc74..a173a9216 100644 --- a/code/Terragen/TerragenLoader.h +++ b/code/Terragen/TerragenLoader.h @@ -4,7 +4,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2020, assimp team - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -47,21 +46,21 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define INCLUDED_AI_TERRAGEN_TERRAIN_LOADER_H #include -namespace Assimp { +namespace Assimp { // Magic strings -#define AI_TERR_BASE_STRING "TERRAGEN" -#define AI_TERR_TERRAIN_STRING "TERRAIN " -#define AI_TERR_EOF_STRING "EOF " +#define AI_TERR_BASE_STRING "TERRAGEN" +#define AI_TERR_TERRAIN_STRING "TERRAIN " +#define AI_TERR_EOF_STRING "EOF " // Chunka -#define AI_TERR_CHUNK_XPTS "XPTS" -#define AI_TERR_CHUNK_YPTS "YPTS" -#define AI_TERR_CHUNK_SIZE "SIZE" -#define AI_TERR_CHUNK_SCAL "SCAL" -#define AI_TERR_CHUNK_CRAD "CRAD" -#define AI_TERR_CHUNK_CRVM "CRVM" -#define AI_TERR_CHUNK_ALTW "ALTW" +#define AI_TERR_CHUNK_XPTS "XPTS" +#define AI_TERR_CHUNK_YPTS "YPTS" +#define AI_TERR_CHUNK_SIZE "SIZE" +#define AI_TERR_CHUNK_SCAL "SCAL" +#define AI_TERR_CHUNK_CRAD "CRAD" +#define AI_TERR_CHUNK_CRVM "CRVM" +#define AI_TERR_CHUNK_ALTW "ALTW" // --------------------------------------------------------------------------- /** @brief Importer class to load Terragen (0.9) terrain files. @@ -69,33 +68,28 @@ namespace Assimp { * The loader is basing on the information found here: * http://www.planetside.co.uk/terragen/dev/tgterrain.html#chunks */ -class TerragenImporter : public BaseImporter -{ +class TerragenImporter : public BaseImporter { public: TerragenImporter(); ~TerragenImporter(); - public: - // ------------------------------------------------------------------- - bool CanRead( const std::string& pFile, IOSystem* pIOHandler, - bool checkSig) const; + bool CanRead(const std::string &pFile, IOSystem *pIOHandler, + bool checkSig) const; protected: + // ------------------------------------------------------------------- + const aiImporterDesc *GetInfo() const; // ------------------------------------------------------------------- - const aiImporterDesc* GetInfo () const; + void InternReadFile(const std::string &pFile, aiScene *pScene, + IOSystem *pIOHandler); // ------------------------------------------------------------------- - void InternReadFile( const std::string& pFile, aiScene* pScene, - IOSystem* pIOHandler); - - // ------------------------------------------------------------------- - void SetupProperties(const Importer* pImp); + void SetupProperties(const Importer *pImp); private: - bool configComputeUVs; }; //! class TerragenImporter diff --git a/code/Unreal/UnrealLoader.cpp b/code/Unreal/UnrealLoader.cpp index a55706138..275c39b32 100644 --- a/code/Unreal/UnrealLoader.cpp +++ b/code/Unreal/UnrealLoader.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2020, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -48,26 +46,112 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * http://local.wasp.uwa.edu.au/~pbourke/dataformats/unreal/ */ - - #ifndef ASSIMP_BUILD_NO_3D_IMPORTER #include "Unreal/UnrealLoader.h" #include "PostProcessing/ConvertToLHProcess.h" -#include #include +#include #include -#include +#include +#include #include #include -#include -#include +#include +#include #include using namespace Assimp; +namespace Unreal { + +/* + 0 = Normal one-sided + 1 = Normal two-sided + 2 = Translucent two-sided + 3 = Masked two-sided + 4 = Modulation blended two-sided + 8 = Placeholder triangle for weapon positioning (invisible) + */ +enum MeshFlags { + MF_NORMAL_OS = 0, + MF_NORMAL_TS = 1, + MF_NORMAL_TRANS_TS = 2, + MF_NORMAL_MASKED_TS = 3, + MF_NORMAL_MOD_TS = 4, + MF_WEAPON_PLACEHOLDER = 8 +}; + +// a single triangle +struct Triangle { + uint16_t mVertex[3]; // Vertex indices + char mType; // James' Mesh Type + char mColor; // Color for flat and Gourand Shaded + unsigned char mTex[3][2]; // Texture UV coordinates + unsigned char mTextureNum; // Source texture offset + char mFlags; // Unreal Mesh Flags (unused) + unsigned int matIndex; +}; + +// temporary representation for a material +struct TempMat { + TempMat() : + type(MF_NORMAL_OS), tex(), numFaces(0) {} + + explicit TempMat(const Triangle &in) : + type((Unreal::MeshFlags)in.mType), tex(in.mTextureNum), numFaces(0) {} + + // type of mesh + Unreal::MeshFlags type; + + // index of texture + unsigned int tex; + + // number of faces using us + unsigned int numFaces; + + // for std::find + bool operator==(const TempMat &o) { + return (tex == o.tex && type == o.type); + } +}; + +struct Vertex { + int32_t X : 11; + int32_t Y : 11; + int32_t Z : 10; +}; + +// UNREAL vertex compression +inline void CompressVertex(const aiVector3D &v, uint32_t &out) { + union { + Vertex n; + int32_t t; + }; + t = 0; + n.X = (int32_t)v.x; + n.Y = (int32_t)v.y; + n.Z = (int32_t)v.z; + ::memcpy(&out, &t, sizeof(int32_t)); +} + +// UNREAL vertex decompression +inline void DecompressVertex(aiVector3D &v, int32_t in) { + union { + Vertex n; + int32_t i; + }; + i = in; + + v.x = (float)n.X; + v.y = (float)n.Y; + v.z = (float)n.Z; +} + +} // end namespace Unreal + static const aiImporterDesc desc = { "Unreal Mesh Importer", "", @@ -81,79 +165,70 @@ static const aiImporterDesc desc = { "3d uc" }; - // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer -UnrealImporter::UnrealImporter() -: configFrameID (0) -, configHandleFlags (true) -{} +UnrealImporter::UnrealImporter() : + mConfigFrameID(0), mConfigHandleFlags(true) {} // ------------------------------------------------------------------------------------------------ // Destructor, private as well -UnrealImporter::~UnrealImporter() -{} +UnrealImporter::~UnrealImporter() {} // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool UnrealImporter::CanRead( const std::string& pFile, IOSystem* /*pIOHandler*/, bool /*checkSig*/) const -{ - return SimpleExtensionCheck(pFile,"3d","uc"); +bool UnrealImporter::CanRead(const std::string &pFile, IOSystem * /*pIOHandler*/, bool /*checkSig*/) const { + return SimpleExtensionCheck(pFile, "3d", "uc"); } // ------------------------------------------------------------------------------------------------ // Build a string of all file extensions supported -const aiImporterDesc* UnrealImporter::GetInfo () const -{ +const aiImporterDesc *UnrealImporter::GetInfo() const { return &desc; } // ------------------------------------------------------------------------------------------------ // Setup configuration properties for the loader -void UnrealImporter::SetupProperties(const Importer* pImp) -{ +void UnrealImporter::SetupProperties(const Importer *pImp) { // The // AI_CONFIG_IMPORT_UNREAL_KEYFRAME option overrides the // AI_CONFIG_IMPORT_GLOBAL_KEYFRAME option. - configFrameID = pImp->GetPropertyInteger(AI_CONFIG_IMPORT_UNREAL_KEYFRAME,-1); - if(static_cast(-1) == configFrameID) { - configFrameID = pImp->GetPropertyInteger(AI_CONFIG_IMPORT_GLOBAL_KEYFRAME,0); + mConfigFrameID = pImp->GetPropertyInteger(AI_CONFIG_IMPORT_UNREAL_KEYFRAME, -1); + if (static_cast(-1) == mConfigFrameID) { + mConfigFrameID = pImp->GetPropertyInteger(AI_CONFIG_IMPORT_GLOBAL_KEYFRAME, 0); } // AI_CONFIG_IMPORT_UNREAL_HANDLE_FLAGS, default is true - configHandleFlags = (0 != pImp->GetPropertyInteger(AI_CONFIG_IMPORT_UNREAL_HANDLE_FLAGS,1)); + mConfigHandleFlags = (0 != pImp->GetPropertyInteger(AI_CONFIG_IMPORT_UNREAL_HANDLE_FLAGS, 1)); } // ------------------------------------------------------------------------------------------------ // Imports the given file into the given scene structure. -void UnrealImporter::InternReadFile( const std::string& pFile, - aiScene* pScene, IOSystem* pIOHandler) -{ +void UnrealImporter::InternReadFile(const std::string &pFile, + aiScene *pScene, IOSystem *pIOHandler) { // For any of the 3 files being passed get the three correct paths // First of all, determine file extension std::string::size_type pos = pFile.find_last_of('.'); std::string extension = GetExtension(pFile); - std::string d_path,a_path,uc_path; - if (extension == "3d") { + std::string d_path, a_path, uc_path; + if (extension == "3d") { // jjjj_d.3d // jjjj_a.3d pos = pFile.find_last_of('_'); if (std::string::npos == pos) { throw DeadlyImportError("UNREAL: Unexpected naming scheme"); } - extension = pFile.substr(0,pos); - } - else { - extension = pFile.substr(0,pos); + extension = pFile.substr(0, pos); + } else { + extension = pFile.substr(0, pos); } // build proper paths - d_path = extension+"_d.3d"; - a_path = extension+"_a.3d"; - uc_path = extension+".uc"; + d_path = extension + "_d.3d"; + a_path = extension + "_a.3d"; + uc_path = extension + ".uc"; - ASSIMP_LOG_DEBUG_F( "UNREAL: data file is ", d_path); + ASSIMP_LOG_DEBUG_F("UNREAL: data file is ", d_path); ASSIMP_LOG_DEBUG_F("UNREAL: aniv file is ", a_path); ASSIMP_LOG_DEBUG_F("UNREAL: uc file is ", uc_path); @@ -174,11 +249,11 @@ void UnrealImporter::InternReadFile( const std::string& pFile, // collect triangles std::vector triangles(numTris); - for (auto & tri : triangles) { - for (unsigned int i = 0; i < 3;++i) { + for (auto &tri : triangles) { + for (unsigned int i = 0; i < 3; ++i) { tri.mVertex[i] = d_reader.GetI2(); - if (tri.mVertex[i] >= numTris) { + if (tri.mVertex[i] >= numTris) { ASSIMP_LOG_WARN("UNREAL: vertex index out of range"); tri.mVertex[i] = 0; } @@ -186,7 +261,7 @@ void UnrealImporter::InternReadFile( const std::string& pFile, tri.mType = d_reader.GetI1(); // handle mesh flagss? - if (configHandleFlags) + if (mConfigHandleFlags) tri.mType = Unreal::MF_NORMAL_OS; else { // ignore MOD and MASKED for the moment, treat them as two-sided @@ -195,12 +270,12 @@ void UnrealImporter::InternReadFile( const std::string& pFile, } d_reader.IncPtr(1); - for (unsigned int i = 0; i < 3;++i) - for (unsigned int i2 = 0; i2 < 2;++i2) + for (unsigned int i = 0; i < 3; ++i) + for (unsigned int i2 = 0; i2 < 2; ++i2) tri.mTex[i][i2] = d_reader.GetI1(); tri.mTextureNum = d_reader.GetI1(); - maxTexIdx = std::max(maxTexIdx,(unsigned int)tri.mTextureNum); + maxTexIdx = std::max(maxTexIdx, (unsigned int)tri.mTextureNum); d_reader.IncPtr(1); } @@ -211,63 +286,64 @@ void UnrealImporter::InternReadFile( const std::string& pFile, // read number of frames const uint32_t numFrames = a_reader.GetI2(); - if (configFrameID >= numFrames) { + if (mConfigFrameID >= numFrames) { throw DeadlyImportError("UNREAL: The requested frame does not exist"); } uint32_t st = a_reader.GetI2(); - if (st != numVert*4u) + if (st != numVert * 4u) throw DeadlyImportError("UNREAL: Unexpected aniv file length"); // skip to our frame - a_reader.IncPtr(configFrameID *numVert*4); + a_reader.IncPtr(mConfigFrameID * numVert * 4); // collect vertices std::vector vertices(numVert); - for (auto &vertex : vertices) { + for (auto &vertex : vertices) { int32_t val = a_reader.GetI4(); - Unreal::DecompressVertex(vertex ,val); + Unreal::DecompressVertex(vertex, val); } // list of textures. - std::vector< std::pair > textures; + std::vector> textures; // allocate the output scene - aiNode* nd = pScene->mRootNode = new aiNode(); + aiNode *nd = pScene->mRootNode = new aiNode(); nd->mName.Set(""); // we can live without the uc file if necessary - std::unique_ptr pb (pIOHandler->Open(uc_path)); - if (pb.get()) { + std::unique_ptr pb(pIOHandler->Open(uc_path)); + if (pb.get()) { std::vector _data; - TextFileToBuffer(pb.get(),_data); - const char* data = &_data[0]; + TextFileToBuffer(pb.get(), _data); + const char *data = &_data[0]; - std::vector< std::pair< std::string,std::string > > tempTextures; + std::vector> tempTextures; // do a quick search in the UC file for some known, usually texture-related, tags - for (;*data;++data) { - if (TokenMatchI(data,"#exec",5)) { + for (; *data; ++data) { + if (TokenMatchI(data, "#exec", 5)) { SkipSpacesAndLineEnd(&data); // #exec TEXTURE IMPORT [...] NAME=jjjjj [...] FILE=jjjj.pcx [...] - if (TokenMatchI(data,"TEXTURE",7)) { + if (TokenMatchI(data, "TEXTURE", 7)) { SkipSpacesAndLineEnd(&data); - if (TokenMatchI(data,"IMPORT",6)) { - tempTextures.push_back(std::pair< std::string,std::string >()); - std::pair< std::string,std::string >& me = tempTextures.back(); - for (;!IsLineEnd(*data);++data) { - if (!::ASSIMP_strincmp(data,"NAME=",5)) { - const char *d = data+=5; - for (;!IsSpaceOrNewLine(*data);++data); - me.first = std::string(d,(size_t)(data-d)); - } - else if (!::ASSIMP_strincmp(data,"FILE=",5)) { - const char *d = data+=5; - for (;!IsSpaceOrNewLine(*data);++data); - me.second = std::string(d,(size_t)(data-d)); + if (TokenMatchI(data, "IMPORT", 6)) { + tempTextures.push_back(std::pair()); + std::pair &me = tempTextures.back(); + for (; !IsLineEnd(*data); ++data) { + if (!::ASSIMP_strincmp(data, "NAME=", 5)) { + const char *d = data += 5; + for (; !IsSpaceOrNewLine(*data); ++data) + ; + me.first = std::string(d, (size_t)(data - d)); + } else if (!::ASSIMP_strincmp(data, "FILE=", 5)) { + const char *d = data += 5; + for (; !IsSpaceOrNewLine(*data); ++data) + ; + me.second = std::string(d, (size_t)(data - d)); } } if (!me.first.length() || !me.second.length()) @@ -276,65 +352,61 @@ void UnrealImporter::InternReadFile( const std::string& pFile, } // #exec MESHMAP SETTEXTURE MESHMAP=box NUM=1 TEXTURE=Jtex1 // #exec MESHMAP SCALE MESHMAP=box X=0.1 Y=0.1 Z=0.2 - else if (TokenMatchI(data,"MESHMAP",7)) { + else if (TokenMatchI(data, "MESHMAP", 7)) { SkipSpacesAndLineEnd(&data); - if (TokenMatchI(data,"SETTEXTURE",10)) { + if (TokenMatchI(data, "SETTEXTURE", 10)) { textures.push_back(std::pair()); - std::pair& me = textures.back(); + std::pair &me = textures.back(); - for (;!IsLineEnd(*data);++data) { - if (!::ASSIMP_strincmp(data,"NUM=",4)) { + for (; !IsLineEnd(*data); ++data) { + if (!::ASSIMP_strincmp(data, "NUM=", 4)) { data += 4; - me.first = strtoul10(data,&data); - } - else if (!::ASSIMP_strincmp(data,"TEXTURE=",8)) { + me.first = strtoul10(data, &data); + } else if (!::ASSIMP_strincmp(data, "TEXTURE=", 8)) { data += 8; const char *d = data; - for (;!IsSpaceOrNewLine(*data);++data); - me.second = std::string(d,(size_t)(data-d)); + for (; !IsSpaceOrNewLine(*data); ++data) + ; + me.second = std::string(d, (size_t)(data - d)); // try to find matching path names, doesn't care if we don't find them - for (std::vector< std::pair< std::string,std::string > >::const_iterator it = tempTextures.begin(); - it != tempTextures.end(); ++it) { - if ((*it).first == me.second) { + for (std::vector>::const_iterator it = tempTextures.begin(); + it != tempTextures.end(); ++it) { + if ((*it).first == me.second) { me.second = (*it).second; break; } } } } - } - else if (TokenMatchI(data,"SCALE",5)) { + } else if (TokenMatchI(data, "SCALE", 5)) { - for (;!IsLineEnd(*data);++data) { - if (data[0] == 'X' && data[1] == '=') { - data = fast_atoreal_move(data+2,(float&)nd->mTransformation.a1); - } - else if (data[0] == 'Y' && data[1] == '=') { - data = fast_atoreal_move(data+2,(float&)nd->mTransformation.b2); - } - else if (data[0] == 'Z' && data[1] == '=') { - data = fast_atoreal_move(data+2,(float&)nd->mTransformation.c3); + for (; !IsLineEnd(*data); ++data) { + if (data[0] == 'X' && data[1] == '=') { + data = fast_atoreal_move(data + 2, (float &)nd->mTransformation.a1); + } else if (data[0] == 'Y' && data[1] == '=') { + data = fast_atoreal_move(data + 2, (float &)nd->mTransformation.b2); + } else if (data[0] == 'Z' && data[1] == '=') { + data = fast_atoreal_move(data + 2, (float &)nd->mTransformation.c3); } } } } } } - } - else { + } else { ASSIMP_LOG_ERROR("Unable to open .uc file"); } std::vector materials; - materials.reserve(textures.size()*2+5); + materials.reserve(textures.size() * 2 + 5); // find out how many output meshes and materials we'll have and build material indices - for (Unreal::Triangle &tri : triangles) { + for (Unreal::Triangle &tri : triangles) { Unreal::TempMat mat(tri); - std::vector::iterator nt = std::find(materials.begin(),materials.end(),mat); + std::vector::iterator nt = std::find(materials.begin(), materials.end(), mat); if (nt == materials.end()) { // add material tri.matIndex = static_cast(materials.size()); @@ -342,9 +414,8 @@ void UnrealImporter::InternReadFile( const std::string& pFile, materials.push_back(mat); ++pScene->mNumMeshes; - } - else { - tri.matIndex = static_cast(nt-materials.begin()); + } else { + tri.matIndex = static_cast(nt - materials.begin()); ++nt->numFaces; } } @@ -354,65 +425,65 @@ void UnrealImporter::InternReadFile( const std::string& pFile, } // allocate meshes and bind them to the node graph - pScene->mMeshes = new aiMesh*[pScene->mNumMeshes]; - pScene->mMaterials = new aiMaterial*[pScene->mNumMaterials = pScene->mNumMeshes]; + pScene->mMeshes = new aiMesh *[pScene->mNumMeshes]; + pScene->mMaterials = new aiMaterial *[pScene->mNumMaterials = pScene->mNumMeshes]; - nd->mNumMeshes = pScene->mNumMeshes; + nd->mNumMeshes = pScene->mNumMeshes; nd->mMeshes = new unsigned int[nd->mNumMeshes]; - for (unsigned int i = 0; i < pScene->mNumMeshes;++i) { - aiMesh* m = pScene->mMeshes[i] = new aiMesh(); + for (unsigned int i = 0; i < pScene->mNumMeshes; ++i) { + aiMesh *m = pScene->mMeshes[i] = new aiMesh(); m->mPrimitiveTypes = aiPrimitiveType_TRIANGLE; const unsigned int num = materials[i].numFaces; - m->mFaces = new aiFace [num]; - m->mVertices = new aiVector3D [num*3]; - m->mTextureCoords[0] = new aiVector3D [num*3]; + m->mFaces = new aiFace[num]; + m->mVertices = new aiVector3D[num * 3]; + m->mTextureCoords[0] = new aiVector3D[num * 3]; nd->mMeshes[i] = i; // create materials, too - aiMaterial* mat = new aiMaterial(); + aiMaterial *mat = new aiMaterial(); pScene->mMaterials[i] = mat; // all white by default - texture rulez - aiColor3D color(1.f,1.f,1.f); + aiColor3D color(1.f, 1.f, 1.f); aiString s; - ::ai_snprintf( s.data, MAXLEN, "mat%u_tx%u_",i,materials[i].tex ); + ::ai_snprintf(s.data, MAXLEN, "mat%u_tx%u_", i, materials[i].tex); // set the two-sided flag if (materials[i].type == Unreal::MF_NORMAL_TS) { const int twosided = 1; - mat->AddProperty(&twosided,1,AI_MATKEY_TWOSIDED); - ::strcat(s.data,"ts_"); - } - else ::strcat(s.data,"os_"); + mat->AddProperty(&twosided, 1, AI_MATKEY_TWOSIDED); + ::strcat(s.data, "ts_"); + } else + ::strcat(s.data, "os_"); // make TRANS faces 90% opaque that RemRedundantMaterials won't catch us - if (materials[i].type == Unreal::MF_NORMAL_TRANS_TS) { + if (materials[i].type == Unreal::MF_NORMAL_TRANS_TS) { const float opac = 0.9f; - mat->AddProperty(&opac,1,AI_MATKEY_OPACITY); - ::strcat(s.data,"tran_"); - } - else ::strcat(s.data,"opaq_"); + mat->AddProperty(&opac, 1, AI_MATKEY_OPACITY); + ::strcat(s.data, "tran_"); + } else + ::strcat(s.data, "opaq_"); // a special name for the weapon attachment point if (materials[i].type == Unreal::MF_WEAPON_PLACEHOLDER) { - s.length = ::ai_snprintf( s.data, MAXLEN, "$WeaponTag$" ); - color = aiColor3D(0.f,0.f,0.f); + s.length = ::ai_snprintf(s.data, MAXLEN, "$WeaponTag$"); + color = aiColor3D(0.f, 0.f, 0.f); } // set color and name - mat->AddProperty(&color,1,AI_MATKEY_COLOR_DIFFUSE); - s.length = (ai_uint32)::strlen(s.data); - mat->AddProperty(&s,AI_MATKEY_NAME); + mat->AddProperty(&color, 1, AI_MATKEY_COLOR_DIFFUSE); + s.length = static_cast(::strlen(s.data)); + mat->AddProperty(&s, AI_MATKEY_NAME); // set texture, if any const unsigned int tex = materials[i].tex; - for (std::vector< std::pair< unsigned int, std::string > >::const_iterator it = textures.begin();it != textures.end();++it) { + for (std::vector>::const_iterator it = textures.begin(); it != textures.end(); ++it) { if ((*it).first == tex) { s.Set((*it).second); - mat->AddProperty(&s,AI_MATKEY_TEXTURE_DIFFUSE(0)); + mat->AddProperty(&s, AI_MATKEY_TEXTURE_DIFFUSE(0)); break; } } @@ -421,17 +492,17 @@ void UnrealImporter::InternReadFile( const std::string& pFile, // fill them. for (const Unreal::Triangle &tri : triangles) { Unreal::TempMat mat(tri); - std::vector::iterator nt = std::find(materials.begin(),materials.end(),mat); + std::vector::iterator nt = std::find(materials.begin(), materials.end(), mat); - aiMesh* mesh = pScene->mMeshes[nt-materials.begin()]; - aiFace& f = mesh->mFaces[mesh->mNumFaces++]; - f.mIndices = new unsigned int[f.mNumIndices = 3]; + aiMesh *mesh = pScene->mMeshes[nt - materials.begin()]; + aiFace &f = mesh->mFaces[mesh->mNumFaces++]; + f.mIndices = new unsigned int[f.mNumIndices = 3]; - for (unsigned int i = 0; i < 3;++i,mesh->mNumVertices++) { + for (unsigned int i = 0; i < 3; ++i, mesh->mNumVertices++) { f.mIndices[i] = mesh->mNumVertices; - mesh->mVertices[mesh->mNumVertices] = vertices[ tri.mVertex[i] ]; - mesh->mTextureCoords[0][mesh->mNumVertices] = aiVector3D( tri.mTex[i][0] / 255.f, 1.f - tri.mTex[i][1] / 255.f, 0.f); + mesh->mVertices[mesh->mNumVertices] = vertices[tri.mVertex[i]]; + mesh->mTextureCoords[0][mesh->mNumVertices] = aiVector3D(tri.mTex[i][0] / 255.f, 1.f - tri.mTex[i][1] / 255.f, 0.f); } } diff --git a/code/Unreal/UnrealLoader.h b/code/Unreal/UnrealLoader.h index c00dfd34e..f1070fbba 100644 --- a/code/Unreal/UnrealLoader.h +++ b/code/Unreal/UnrealLoader.h @@ -4,7 +4,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2020, assimp team - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -47,161 +46,57 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define INCLUDED_AI_3D_LOADER_H #include -#include -namespace Assimp { -namespace Unreal { - - /* - 0 = Normal one-sided - 1 = Normal two-sided - 2 = Translucent two-sided - 3 = Masked two-sided - 4 = Modulation blended two-sided - 8 = Placeholder triangle for weapon positioning (invisible) - */ -enum MeshFlags { - MF_NORMAL_OS = 0, - MF_NORMAL_TS = 1, - MF_NORMAL_TRANS_TS = 2, - MF_NORMAL_MASKED_TS = 3, - MF_NORMAL_MOD_TS = 4, - MF_WEAPON_PLACEHOLDER = 8 -}; - - // a single triangle -struct Triangle { - uint16_t mVertex[3]; // Vertex indices - char mType; // James' Mesh Type - char mColor; // Color for flat and Gourand Shaded - unsigned char mTex[3][2]; // Texture UV coordinates - unsigned char mTextureNum; // Source texture offset - char mFlags; // Unreal Mesh Flags (unused) - - unsigned int matIndex; -}; - -// temporary representation for a material -struct TempMat { - TempMat() - : type() - , tex() - , numFaces (0) - {} - - explicit TempMat(const Triangle& in) - : type ((Unreal::MeshFlags)in.mType) - , tex (in.mTextureNum) - , numFaces (0) - {} - - // type of mesh - Unreal::MeshFlags type; - - // index of texture - unsigned int tex; - - // number of faces using us - unsigned int numFaces; - - // for std::find - bool operator == (const TempMat& o ) { - return (tex == o.tex && type == o.type); - } -}; - -struct Vertex -{ - int32_t X : 11; - int32_t Y : 11; - int32_t Z : 10; -}; - - // UNREAL vertex compression -inline void CompressVertex(const aiVector3D& v, uint32_t& out) -{ - union { - Vertex n; - int32_t t; - }; - n.X = (int32_t)v.x; - n.Y = (int32_t)v.y; - n.Z = (int32_t)v.z; - ::memcpy( &out, &t, sizeof(int32_t)); - //out = t; -} - - // UNREAL vertex decompression -inline void DecompressVertex(aiVector3D& v, int32_t in) -{ - union { - Vertex n; - int32_t i; - }; - i = in; - - v.x = (float)n.X; - v.y = (float)n.Y; - v.z = (float)n.Z; -} - -} // end namespace Unreal +namespace Assimp { // --------------------------------------------------------------------------- /** @brief Importer class to load UNREAL files (*.3d) */ -class UnrealImporter : public BaseImporter -{ +class UnrealImporter : public BaseImporter { public: UnrealImporter(); ~UnrealImporter(); - -public: - // ------------------------------------------------------------------- /** @brief Returns whether we can handle the format of the given file * * See BaseImporter::CanRead() for details. **/ - bool CanRead( const std::string& pFile, IOSystem* pIOHandler, - bool checkSig) const; + bool CanRead(const std::string &pFile, IOSystem *pIOHandler, + bool checkSig) const; protected: - // ------------------------------------------------------------------- /** @brief Called by Importer::GetExtensionList() * * See #BaseImporter::GetInfo for the details */ - const aiImporterDesc* GetInfo () const; - + const aiImporterDesc *GetInfo() const; // ------------------------------------------------------------------- /** @brief Setup properties for the importer * * See BaseImporter::SetupProperties() for details */ - void SetupProperties(const Importer* pImp); - + void SetupProperties(const Importer *pImp); // ------------------------------------------------------------------- /** @brief Imports the given file into the given scene structure. * * See BaseImporter::InternReadFile() for details */ - void InternReadFile( const std::string& pFile, aiScene* pScene, - IOSystem* pIOHandler); + void InternReadFile(const std::string &pFile, aiScene *pScene, + IOSystem *pIOHandler); private: - //! frame to be loaded - uint32_t configFrameID; + uint32_t mConfigFrameID; //! process surface flags - bool configHandleFlags; + bool mConfigHandleFlags; }; // !class UnrealImporter } // end of namespace Assimp + #endif // AI_UNREALIMPORTER_H_INC diff --git a/code/XGL/XGLLoader.cpp b/code/XGL/XGLLoader.cpp index 415d8173e..8e4d5c82a 100644 --- a/code/XGL/XGLLoader.cpp +++ b/code/XGL/XGLLoader.cpp @@ -176,7 +176,7 @@ void XGLImporter::InternReadFile( const std::string& pFile, raw_reader->IncPtr(2); zstream.next_in = reinterpret_cast( raw_reader->GetPtr() ); - zstream.avail_in = raw_reader->GetRemainingSize(); + zstream.avail_in = (uInt) raw_reader->GetRemainingSize(); size_t total = 0l; diff --git a/code/glTF/glTFAsset.h b/code/glTF/glTFAsset.h index cd2e3166b..9673624f5 100644 --- a/code/glTF/glTFAsset.h +++ b/code/glTF/glTFAsset.h @@ -382,7 +382,12 @@ namespace glTF { friend struct Accessor; - Accessor& accessor; + // This field is reported as not used, making it protectd is the easiest way to work around it without going to the bottom of what the problem is: + // ../code/glTF2/glTF2Asset.h:392:19: error: private field 'accessor' is not used [-Werror,-Wunused-private-field] + protected: + Accessor &accessor; + + private: uint8_t* data; size_t elemSize, stride; diff --git a/code/glTF2/glTF2Asset.h b/code/glTF2/glTF2Asset.h index c27522df3..f9add768e 100644 --- a/code/glTF2/glTF2Asset.h +++ b/code/glTF2/glTF2Asset.h @@ -58,6 +58,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include #include #include #include @@ -81,14 +82,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define ASSIMP_GLTF_USE_UNORDERED_MULTIMAP #else #define gltf_unordered_map map +#define gltf_unordered_set set #endif #ifdef ASSIMP_GLTF_USE_UNORDERED_MULTIMAP #include +#include #if _MSC_VER > 1600 #define gltf_unordered_map unordered_map +#define gltf_unordered_set unordered_set #else #define gltf_unordered_map tr1::unordered_map +#define gltf_unordered_set tr1::unordered_set #endif #endif @@ -375,8 +380,8 @@ struct Accessor : public Object { inline uint8_t *GetPointer(); - template - bool ExtractData(T *&outData); + template + void ExtractData(T *&outData); void WriteData(size_t count, const void *src_buffer, size_t src_stride); @@ -384,12 +389,18 @@ struct Accessor : public Object { class Indexer { friend struct Accessor; + // This field is reported as not used, making it protectd is the easiest way to work around it without going to the bottom of what the problem is: + // ../code/glTF2/glTF2Asset.h:392:19: error: private field 'accessor' is not used [-Werror,-Wunused-private-field] + protected: Accessor &accessor; + + private: uint8_t *data; size_t elemSize, stride; Indexer(Accessor &acc); - + + public: //! Accesses the i-th value as defined by the accessor template @@ -720,6 +731,7 @@ struct Mesh : public Object { std::vector primitives; std::vector weights; + std::vector targetNames; Mesh() {} @@ -874,6 +886,8 @@ class LazyDict : public LazyDictBase { Value *mDict; //! JSON dictionary object Asset &mAsset; //! The asset instance + std::gltf_unordered_set mRecursiveReferenceCheck; //! Used by Retrieve to prevent recursive lookups + void AttachToDocument(Document &doc); void DetachFromDocument(); diff --git a/code/glTF2/glTF2Asset.inl b/code/glTF2/glTF2Asset.inl index f9c3aa805..ed23b388a 100644 --- a/code/glTF2/glTF2Asset.inl +++ b/code/glTF2/glTF2Asset.inl @@ -280,6 +280,11 @@ Ref LazyDict::Retrieve(unsigned int i) { throw DeadlyImportError("GLTF: Object at index \"" + to_string(i) + "\" is not a JSON object"); } + if (mRecursiveReferenceCheck.find(i) != mRecursiveReferenceCheck.end()) { + throw DeadlyImportError("GLTF: Object at index \"" + to_string(i) + "\" has recursive reference to itself"); + } + mRecursiveReferenceCheck.insert(i); + // Unique ptr prevents memory leak in case of Read throws an exception auto inst = std::unique_ptr(new T()); inst->id = std::string(mDictId) + "_" + to_string(i); @@ -287,7 +292,9 @@ Ref LazyDict::Retrieve(unsigned int i) { ReadMember(obj, "name", inst->name); inst->Read(obj, mAsset); - return Add(inst.release()); + Ref result = Add(inst.release()); + mRecursiveReferenceCheck.erase(i); + return result; } template @@ -508,18 +515,23 @@ inline size_t Buffer::AppendData(uint8_t *data, size_t length) { } inline void Buffer::Grow(size_t amount) { - if (amount <= 0) return; + if (amount <= 0) { + return; + } + + // Capacity is big enough if (capacity >= byteLength + amount) { byteLength += amount; return; } - // Shift operation is standard way to divide integer by 2, it doesn't cast it to float back and forth, also works for odd numbers, - // originally it would look like: static_cast(capacity * 1.5f) - capacity = std::max(capacity + (capacity >> 1), byteLength + amount); + // Just allocate data which we need + capacity = byteLength + amount; uint8_t *b = new uint8_t[capacity]; - if (mData) memcpy(b, mData.get(), byteLength); + if (nullptr != mData) { + memcpy(b, mData.get(), byteLength); + } mData.reset(b, std::default_delete()); byteLength += amount; } @@ -608,10 +620,13 @@ inline void CopyData(size_t count, } } // namespace -template -bool Accessor::ExtractData(T *&outData) { - uint8_t *data = GetPointer(); - if (!data) return false; +template +void Accessor::ExtractData(T *&outData) +{ + uint8_t* data = GetPointer(); + if (!data) { + throw DeadlyImportError("GLTF: data is NULL"); + } const size_t elemSize = GetElementSize(); const size_t totalSize = elemSize * count; @@ -631,8 +646,6 @@ bool Accessor::ExtractData(T *&outData) { memcpy(outData + i, data + i * stride, elemSize); } } - - return true; } inline void Accessor::WriteData(size_t _count, const void *src_buffer, size_t src_stride) { @@ -1021,6 +1034,19 @@ inline void Mesh::Read(Value &pJSON_Object, Asset &pAsset_Root) { } } } + + Value *extras = FindObject(pJSON_Object, "extras"); + if (nullptr != extras ) { + if (Value* curTargetNames = FindArray(*extras, "targetNames")) { + this->targetNames.resize(curTargetNames->Size()); + for (unsigned int i = 0; i < curTargetNames->Size(); ++i) { + Value& targetNameValue = (*curTargetNames)[i]; + if (targetNameValue.IsString()) { + this->targetNames[i] = targetNameValue.GetString(); + } + } + } + } } inline void Camera::Read(Value &obj, Asset & /*r*/) { diff --git a/code/glTF2/glTF2Importer.cpp b/code/glTF2/glTF2Importer.cpp index caff630dc..75fb3d1b7 100644 --- a/code/glTF2/glTF2Importer.cpp +++ b/code/glTF2/glTF2Importer.cpp @@ -472,6 +472,9 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { if (mesh.weights.size() > i) { aiAnimMesh.mWeight = mesh.weights[i]; } + if (mesh.targetNames.size() > i) { + aiAnimMesh.mName = mesh.targetNames[i]; + } } } @@ -680,6 +683,7 @@ void glTF2Importer::ImportCameras(glTF2::Asset &r) { aicam->mClipPlaneFar = cam.cameraProperties.ortographic.zfar; aicam->mClipPlaneNear = cam.cameraProperties.ortographic.znear; aicam->mHorizontalFOV = 0.0; + aicam->mOrthographicWidth = cam.cameraProperties.ortographic.xmag; aicam->mAspect = 1.0f; if (0.f != cam.cameraProperties.ortographic.ymag) { aicam->mAspect = cam.cameraProperties.ortographic.xmag / cam.cameraProperties.ortographic.ymag; diff --git a/contrib/irrXML/CMakeLists.txt b/contrib/irrXML/CMakeLists.txt index 48eec8328..29f11a506 100644 --- a/contrib/irrXML/CMakeLists.txt +++ b/contrib/irrXML/CMakeLists.txt @@ -15,7 +15,11 @@ if ( MSVC ) endif ( MSVC ) IF(CMAKE_SYSTEM_NAME MATCHES "(Darwin|FreeBSD)") - add_library(IrrXML ${IrrXML_SRCS}) + IF(APPLE) + add_library(IrrXML STATIC ${IrrXML_SRCS}) + ELSE() + add_library(IrrXML ${IrrXML_SRCS}) + ENDIF() ELSE() add_library(IrrXML STATIC ${IrrXML_SRCS}) ENDIF() diff --git a/contrib/irrXML/CXMLReaderImpl.h b/contrib/irrXML/CXMLReaderImpl.h index a125312a1..63349b0cc 100644 --- a/contrib/irrXML/CXMLReaderImpl.h +++ b/contrib/irrXML/CXMLReaderImpl.h @@ -8,16 +8,7 @@ #include "irrXML.h" #include "irrString.h" #include "irrArray.h" - -#include -#include -#include -#include -//using namespace Assimp; - -// For locale independent number conversion -#include -#include +#include "fast_atof.h" #ifdef _DEBUG #define IRR_DEBUGPRINT(x) printf((x)); @@ -37,14 +28,23 @@ template class CXMLReaderImpl : public IIrrXMLReader { public: - //! Constructor - CXMLReaderImpl(IFileReadCallBack* callback, bool deleteCallBack = true) - : TextData(0), P(0), TextBegin(0), TextSize(0), CurrentNodeType(EXN_NONE), - SourceFormat(ETF_ASCII), TargetFormat(ETF_ASCII) - { - if (!callback) + CXMLReaderImpl(IFileReadCallBack* callback, bool deleteCallBack = true) + : TextData(0) + , P(0) + , TextBegin(0) + , TextSize(0) + , CurrentNodeType(EXN_NONE) + , SourceFormat(ETF_ASCII) + , TargetFormat(ETF_ASCII) + , NodeName () + , EmptyString() + , IsEmptyElement(false) + , SpecialCharacters() + , Attributes() { + if (!callback) { return; + } storeTargetFormat(); @@ -168,8 +168,7 @@ public: return 0; core::stringc c = attr->Value.c_str(); - return static_cast(atof(c.c_str())); - //return fast_atof(c.c_str()); + return core::fast_atof(c.c_str()); } @@ -181,11 +180,7 @@ public: return 0; core::stringc c = attrvalue; - std::istringstream sstr(c.c_str()); - sstr.imbue(std::locale("C")); // Locale free number convert - float fNum; - sstr >> fNum; - return fNum; + return core::fast_atof(c.c_str()); } @@ -228,7 +223,7 @@ private: { char_type* start = P; - // move forward until '<' found + // more forward until '<' found while(*P != L'<' && *P) ++P; @@ -438,10 +433,6 @@ private: while(*P != L'>') ++P; - // remove trailing whitespace, if any - while( std::isspace( P[-1])) - --P; - NodeName = core::string(pBeginClose, (int)(P - pBeginClose)); ++P; } @@ -676,12 +667,8 @@ private: TextData = new char_type[sizeWithoutHeader]; - // MSVC debugger complains here about loss of data ... - size_t numShift = sizeof( char_type) * 8; - assert(numShift < 64); - const src_char_type cc = (src_char_type)(((uint64_t(1u) << numShift) - 1)); for (int i=0; i +#include + +namespace irr +{ +namespace core +{ + +const float fast_atof_table[] = { + 0.f, + 0.1f, + 0.01f, + 0.001f, + 0.0001f, + 0.00001f, + 0.000001f, + 0.0000001f, + 0.00000001f, + 0.000000001f, + 0.0000000001f, + 0.00000000001f, + 0.000000000001f, + 0.0000000000001f, + 0.00000000000001f, + 0.000000000000001f + }; + +//! Provides a fast function for converting a string into a float, +//! about 6 times faster than atof in win32. +// If you find any bugs, please send them to me, niko (at) irrlicht3d.org. +inline char* fast_atof_move(char* c, float& out) +{ + bool inv = false; + char *t; + float f; + + if (*c=='-') + { + c++; + inv = true; + } + + f = (float)strtol(c, &t, 10); + + c = t; + + if (*c == '.') + { + c++; + + float pl = (float)strtol(c, &t, 10); + pl *= fast_atof_table[t-c]; + + f += pl; + + c = t; + + if (*c == 'e') + { + ++c; + float exp = (float)strtol(c, &t, 10); + f *= (float)pow(10.0f, exp); + c = t; + } + } + + if (inv) + f *= -1.0f; + + out = f; + return c; +} + +//! Provides a fast function for converting a string into a float, +//! about 6 times faster than atof in win32. +// If you find any bugs, please send them to me, niko (at) irrlicht3d.org. +inline const char* fast_atof_move_const(const char* c, float& out) +{ + bool inv = false; + char *t; + float f; + + if (*c=='-') + { + c++; + inv = true; + } + + f = (float)strtol(c, &t, 10); + + c = t; + + if (*c == '.') + { + c++; + + float pl = (float)strtol(c, &t, 10); + pl *= fast_atof_table[t-c]; + + f += pl; + + c = t; + + if (*c == 'e') + { + ++c; + f32 exp = (f32)strtol(c, &t, 10); + f *= (f32)powf(10.0f, exp); + c = t; + } + } + + if (inv) + f *= -1.0f; + + out = f; + return c; +} + + +inline float fast_atof(const char* c) +{ + float ret; + fast_atof_move_const(c, ret); + return ret; +} + +} // end namespace core +}// end namespace irr + +#endif + diff --git a/contrib/irrXML/irrArray.h b/contrib/irrXML/irrArray.h index 51302680e..40c822590 100644 --- a/contrib/irrXML/irrArray.h +++ b/contrib/irrXML/irrArray.h @@ -21,7 +21,8 @@ class array { public: - array() + + array() : data(0), allocated(0), used(0), free_when_destroyed(true), is_sorted(true) { diff --git a/contrib/irrXML/irrString.h b/contrib/irrXML/irrString.h index ff0097b71..246348891 100644 --- a/contrib/irrXML/irrString.h +++ b/contrib/irrXML/irrString.h @@ -29,7 +29,7 @@ public: //! Default constructor string() - : array(0), allocated(1), used(1) + : array(0), allocated(1), used(1) { array = new T[1]; array[0] = 0x0; @@ -39,7 +39,7 @@ public: //! Constructor string(const string& other) - : array(0), allocated(0), used(0) + : array(0), allocated(0), used(0) { *this = other; } @@ -47,7 +47,7 @@ public: //! Constructs a string from an int string(int number) - : array(0), allocated(0), used(0) + : array(0), allocated(0), used(0) { // store if negative and make positive @@ -117,7 +117,7 @@ public: //! Constructor for unicode and ascii strings template string(const B* c) - : array(0),allocated(0), used(0) + : array(0), allocated(0), used(0) { *this = c; } @@ -635,9 +635,6 @@ private: s32 amount = used < new_size ? used : new_size; for (s32 i=0; i 1299) && (_MSC_VER < 1400) -#define _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX /*__asm mov eax,100*/ +#if !defined(_WIN64) && defined(WIN32) && defined(_MSC_VER) && (_MSC_VER > 1299) && (_MSC_VER < 1400) +#define _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX __asm mov eax,100 #else #define _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX #endif // _IRR_MANAGED_MARSHALLING_BUGFIX diff --git a/contrib/irrXML/irrXML.cpp b/contrib/irrXML/irrXML.cpp index 5a4b04507..3fd510302 100644 --- a/contrib/irrXML/irrXML.cpp +++ b/contrib/irrXML/irrXML.cpp @@ -2,14 +2,10 @@ // This file is part of the "Irrlicht Engine" and the "irrXML" project. // For conditions of distribution and use, see copyright notice in irrlicht.h and/or irrXML.h -// Need to include Assimp, too. We're using Assimp's version of fast_atof -// so we need stdint.h. But no PCH. - - #include "irrXML.h" #include "irrString.h" #include "irrArray.h" -//#include +#include "fast_atof.h" #include "CXMLReaderImpl.h" namespace irr @@ -18,7 +14,7 @@ namespace io { //! Implementation of the file read callback for ordinary files -class IRRXML_API CFileReadCallBack : public IFileReadCallBack +class CFileReadCallBack : public IFileReadCallBack { public: diff --git a/contrib/irrXML/irrXML.h b/contrib/irrXML/irrXML.h index d724b3162..30b56c7b9 100644 --- a/contrib/irrXML/irrXML.h +++ b/contrib/irrXML/irrXML.h @@ -7,12 +7,6 @@ #include -#ifdef _WIN32 -# define IRRXML_API __declspec(dllexport) -#else -# define IRRXML_API __attribute__ ((visibility("default"))) -#endif // _WIN32 - /** \mainpage irrXML 1.2 API documentation
@@ -178,7 +172,7 @@ namespace io ETF_UTF32_BE, //! UTF-32 format, little endian - ETF_UTF32_LE + ETF_UTF32_LE, }; @@ -215,7 +209,7 @@ namespace io two methods to read your data and give a pointer to an instance of your implementation when calling createIrrXMLReader(), createIrrXMLReaderUTF16() or createIrrXMLReaderUTF32() */ - class IRRXML_API IFileReadCallBack + class IFileReadCallBack { public: @@ -415,7 +409,7 @@ namespace io \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ - IRRXML_API IrrXMLReader* createIrrXMLReader(const char* filename); + IrrXMLReader* createIrrXMLReader(const char* filename); //! Creates an instance of an UFT-8 or ASCII character xml parser. /** This means that all character data will be returned in 8 bit ASCII or UTF-8. The file to read can @@ -427,7 +421,7 @@ namespace io \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ - IRRXML_API IrrXMLReader* createIrrXMLReader(FILE* file); + IrrXMLReader* createIrrXMLReader(FILE* file); //! Creates an instance of an UFT-8 or ASCII character xml parser. /** This means that all character data will be returned in 8 bit ASCII or UTF-8. The file to read can @@ -440,7 +434,7 @@ namespace io \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ - IRRXML_API IrrXMLReader* createIrrXMLReader(IFileReadCallBack* callback); + IrrXMLReader* createIrrXMLReader(IFileReadCallBack* callback); //! Creates an instance of an UFT-16 xml parser. /** This means that @@ -452,7 +446,7 @@ namespace io \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ - IRRXML_API IrrXMLReaderUTF16* createIrrXMLReaderUTF16(const char* filename); + IrrXMLReaderUTF16* createIrrXMLReaderUTF16(const char* filename); //! Creates an instance of an UFT-16 xml parser. /** This means that all character data will be returned in UTF-16. The file to read can @@ -464,7 +458,7 @@ namespace io \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ - IRRXML_API IrrXMLReaderUTF16* createIrrXMLReaderUTF16(FILE* file); + IrrXMLReaderUTF16* createIrrXMLReaderUTF16(FILE* file); //! Creates an instance of an UFT-16 xml parser. /** This means that all character data will be returned in UTF-16. The file to read can @@ -477,7 +471,7 @@ namespace io \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ - IRRXML_API IrrXMLReaderUTF16* createIrrXMLReaderUTF16(IFileReadCallBack* callback); + IrrXMLReaderUTF16* createIrrXMLReaderUTF16(IFileReadCallBack* callback); //! Creates an instance of an UFT-32 xml parser. @@ -489,7 +483,7 @@ namespace io \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ - IRRXML_API IrrXMLReaderUTF32* createIrrXMLReaderUTF32(const char* filename); + IrrXMLReaderUTF32* createIrrXMLReaderUTF32(const char* filename); //! Creates an instance of an UFT-32 xml parser. /** This means that all character data will be returned in UTF-32. The file to read can @@ -501,7 +495,7 @@ namespace io \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ - IRRXML_API IrrXMLReaderUTF32* createIrrXMLReaderUTF32(FILE* file); + IrrXMLReaderUTF32* createIrrXMLReaderUTF32(FILE* file); //! Creates an instance of an UFT-32 xml parser. /** This means that @@ -515,7 +509,7 @@ namespace io \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ - IRRXML_API IrrXMLReaderUTF32* createIrrXMLReaderUTF32(IFileReadCallBack* callback); + IrrXMLReaderUTF32* createIrrXMLReaderUTF32(IFileReadCallBack* callback); /*! \file irrxml.h diff --git a/include/assimp/MathFunctions.h b/include/assimp/MathFunctions.h index 1880ce0a9..d4bc54451 100644 --- a/include/assimp/MathFunctions.h +++ b/include/assimp/MathFunctions.h @@ -55,36 +55,51 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace Assimp { namespace Math { -// TODO: use binary GCD for unsigned integers .... -template < typename IntegerType > -inline -IntegerType gcd( IntegerType a, IntegerType b ) { +/// @brief Will return the greatest common divisor. +/// @param a [in] Value a. +/// @param b [in] Value b. +/// @return The greatest common divisor. +template +inline IntegerType gcd( IntegerType a, IntegerType b ) { const IntegerType zero = (IntegerType)0; while ( true ) { - if ( a == zero ) + if ( a == zero ) { return b; + } b %= a; - if ( b == zero ) + if ( b == zero ) { return a; + } a %= b; } } +/// @brief Will return the greatest common divisor. +/// @param a [in] Value a. +/// @param b [in] Value b. +/// @return The greatest common divisor. template < typename IntegerType > -inline -IntegerType lcm( IntegerType a, IntegerType b ) { +inline IntegerType lcm( IntegerType a, IntegerType b ) { const IntegerType t = gcd (a,b); - if (!t) + if (!t) { return t; + } return a / t * b; } - +/// @brief Will return the smallest epsilon-value for the requested type. +/// @return The numercical limit epsilon depending on its type. template -inline -T getEpsilon() { +inline T getEpsilon() { return std::numeric_limits::epsilon(); } +/// @brief Will return the constant PI for the requested type. +/// @return Pi +template +inline T PI() { + return static_cast(3.14159265358979323846); } -} + +} // namespace Math +} // namespace Assimp diff --git a/include/assimp/SmallVector.h b/include/assimp/SmallVector.h new file mode 100644 index 000000000..4e0c200e2 --- /dev/null +++ b/include/assimp/SmallVector.h @@ -0,0 +1,164 @@ +/* +Open Asset Import Library (assimp) +---------------------------------------------------------------------- + +Copyright (c) 2006-2020, 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 Defines small vector with inplace storage. +Based on CppCon 2016: Chandler Carruth "High Performance Code 201: Hybrid Data Structures" */ + +#pragma once +#ifndef AI_SMALLVECTOR_H_INC +#define AI_SMALLVECTOR_H_INC + +#ifdef __GNUC__ +# pragma GCC system_header +#endif + +namespace Assimp { + +// -------------------------------------------------------------------------------------------- +/// @brief Small vector with inplace storage. +/// +/// Reduces heap allocations when list is shorter. It uses a small array for a dedicated size. +/// When the growing gets bigger than this small cache a dynamic growing algorithm will be +/// used. +// -------------------------------------------------------------------------------------------- +template +class SmallVector { +public: + /// @brief The default class constructor. + SmallVector() : + mStorage(mInplaceStorage), + mSize(0), + mCapacity(Capacity) { + // empty + } + + /// @brief The class destructor. + ~SmallVector() { + if (mStorage != mInplaceStorage) { + delete [] mStorage; + } + } + + /// @brief Will push a new item. The capacity will grow in case of a too small capacity. + /// @param item [in] The item to push at the end of the vector. + void push_back(const T& item) { + if (mSize < mCapacity) { + mStorage[mSize++] = item; + return; + } + + push_back_and_grow(item); + } + + /// @brief Will resize the vector. + /// @param newSize [in] The new size. + void resize(size_t newSize) { + if (newSize > mCapacity) { + grow(newSize); + } + mSize = newSize; + } + + /// @brief Returns the current size of the vector. + /// @return The current size. + size_t size() const { + return mSize; + } + + /// @brief Returns a pointer to the first item. + /// @return The first item as a pointer. + T* begin() { + return mStorage; + } + + /// @brief Returns a pointer to the end. + /// @return The end as a pointer. + T* end() { + return &mStorage[mSize]; + } + + /// @brief Returns a const pointer to the first item. + /// @return The first item as a const pointer. + T* begin() const { + return mStorage; + } + + /// @brief Returns a const pointer to the end. + /// @return The end as a const pointer. + T* end() const { + return &mStorage[mSize]; + } + + SmallVector(const SmallVector &) = delete; + SmallVector(SmallVector &&) = delete; + SmallVector &operator = (const SmallVector &) = delete; + SmallVector &operator = (SmallVector &&) = delete; + +private: + void grow( size_t newCapacity) { + T* oldStorage = mStorage; + T* newStorage = new T[newCapacity]; + + std::memcpy(newStorage, oldStorage, mSize * sizeof(T)); + + mStorage = newStorage; + mCapacity = newCapacity; + + if (oldStorage != mInplaceStorage) { + delete [] oldStorage; + } + } + + void push_back_and_grow(const T& item) { + grow(mCapacity + Capacity); + + mStorage[mSize++] = item; + } + + T* mStorage; + size_t mSize; + size_t mCapacity; + T mInplaceStorage[Capacity]; +}; + +} // end namespace Assimp + +#endif // !! AI_SMALLVECTOR_H_INC diff --git a/include/assimp/SpatialSort.h b/include/assimp/SpatialSort.h index c2d8bbbf8..4d37eb6e3 100644 --- a/include/assimp/SpatialSort.h +++ b/include/assimp/SpatialSort.h @@ -46,11 +46,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define AI_SPATIALSORT_H_INC #ifdef __GNUC__ -# pragma GCC system_header +#pragma GCC system_header #endif -#include #include +#include namespace Assimp { @@ -62,10 +62,8 @@ namespace Assimp { * time, with O(n) worst case complexity when all vertices lay on the plane. The plane is chosen * so that it avoids common planes in usual data sets. */ // ------------------------------------------------------------------------------------------------ -class ASSIMP_API SpatialSort -{ +class ASSIMP_API SpatialSort { public: - SpatialSort(); // ------------------------------------------------------------------------------------ @@ -76,14 +74,12 @@ public: * @param pNumPositions Number of vectors to expect in that array. * @param pElementOffset Offset in bytes from the beginning of one vector in memory * to the beginning of the next vector. */ - SpatialSort( const aiVector3D* pPositions, unsigned int pNumPositions, - unsigned int pElementOffset); + SpatialSort(const aiVector3D *pPositions, unsigned int pNumPositions, + unsigned int pElementOffset); /** Destructor */ ~SpatialSort(); -public: - // ------------------------------------------------------------------------------------ /** Sets the input data for the SpatialSort. This replaces existing data, if any. * The new data receives new indices in ascending order. @@ -97,17 +93,15 @@ public: * required in order to use #FindPosition() or #GenerateMappingTable(). * If you don't finalize yet, you can use #Append() to add data from * other sources.*/ - void Fill( const aiVector3D* pPositions, unsigned int pNumPositions, - unsigned int pElementOffset, - bool pFinalize = true); - + void Fill(const aiVector3D *pPositions, unsigned int pNumPositions, + unsigned int pElementOffset, + bool pFinalize = true); // ------------------------------------------------------------------------------------ /** Same as #Fill(), except the method appends to existing data in the #SpatialSort. */ - void Append( const aiVector3D* pPositions, unsigned int pNumPositions, - unsigned int pElementOffset, - bool pFinalize = true); - + void Append(const aiVector3D *pPositions, unsigned int pNumPositions, + unsigned int pElementOffset, + bool pFinalize = true); // ------------------------------------------------------------------------------------ /** Finalize the spatial hash data structure. This can be useful after @@ -123,8 +117,8 @@ public: * @param poResults The container to store the indices of the found positions. * Will be emptied by the call so it may contain anything. * @return An iterator to iterate over all vertices in the given area.*/ - void FindPositions( const aiVector3D& pPosition, ai_real pRadius, - std::vector& poResults) const; + void FindPositions(const aiVector3D &pPosition, ai_real pRadius, + std::vector &poResults) const; // ------------------------------------------------------------------------------------ /** Fills an array with indices of all positions identical to the given position. In @@ -133,8 +127,8 @@ public: * @param pPosition The position to look for vertices. * @param poResults The container to store the indices of the found positions. * Will be emptied by the call so it may contain anything.*/ - void FindIdenticalPositions( const aiVector3D& pPosition, - std::vector& poResults) const; + void FindIdenticalPositions(const aiVector3D &pPosition, + std::vector &poResults) const; // ------------------------------------------------------------------------------------ /** Compute a table that maps each vertex ID referring to a spatially close @@ -144,8 +138,8 @@ public: * @param pRadius Maximal distance from the position a vertex may have to * be counted in. * @return Number of unique vertices (n). */ - unsigned int GenerateMappingTable(std::vector& fill, - ai_real pRadius) const; + unsigned int GenerateMappingTable(std::vector &fill, + ai_real pRadius) const; protected: /** Normal of the sorting plane, normalized. The center is always at (0, 0, 0) */ @@ -159,15 +153,17 @@ protected: ai_real mDistance; ///< Distance of this vertex to the sorting plane Entry() AI_NO_EXCEPT - : mIndex( 999999999 ), mPosition(), mDistance( 99999. ) { - // empty + : mIndex(999999999), + mPosition(), + mDistance(99999.) { + // empty } - Entry( unsigned int pIndex, const aiVector3D& pPosition, ai_real pDistance) - : mIndex( pIndex), mPosition( pPosition), mDistance( pDistance) { + Entry(unsigned int pIndex, const aiVector3D &pPosition, ai_real pDistance) : + mIndex(pIndex), mPosition(pPosition), mDistance(pDistance) { // empty } - bool operator < (const Entry& e) const { return mDistance < e.mDistance; } + bool operator<(const Entry &e) const { return mDistance < e.mDistance; } }; // all positions, sorted by distance to the sorting plane diff --git a/include/assimp/StreamReader.h b/include/assimp/StreamReader.h index 4cad96f6e..74bb7995f 100644 --- a/include/assimp/StreamReader.h +++ b/include/assimp/StreamReader.h @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2020, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -49,13 +47,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define AI_STREAMREADER_H_INCLUDED #ifdef __GNUC__ -# pragma GCC system_header +#pragma GCC system_header #endif -#include -#include #include +#include #include +#include #include @@ -74,10 +72,8 @@ namespace Assimp { template class StreamReader { public: - // FIXME: use these data types throughout the whole library, - // then change them to 64 bit values :-) - using diff = int; - using pos = unsigned int; + using diff = size_t; + using pos = size_t; // --------------------------------------------------------------------- /** Construction from a given stream with a well-defined endianness. @@ -91,40 +87,45 @@ public: * stream is in little endian byte order. Otherwise the * endianness information is contained in the @c SwapEndianess * template parameter and this parameter is meaningless. */ - StreamReader(std::shared_ptr stream, bool le = false) - : stream(stream) - , le(le) - { + StreamReader(std::shared_ptr stream, bool le = false) : + mStream(stream), + mBuffer(nullptr), + mCurrent(nullptr), + mEnd(nullptr), + mLimit(nullptr), + mLe(le) { ai_assert(stream); InternBegin(); } // --------------------------------------------------------------------- - StreamReader(IOStream* stream, bool le = false) - : stream(std::shared_ptr(stream)) - , le(le) - { - ai_assert(stream); + StreamReader(IOStream *stream, bool le = false) : + mStream(std::shared_ptr(stream)), + mBuffer(nullptr), + mCurrent(nullptr), + mEnd(nullptr), + mLimit(nullptr), + mLe(le) { + ai_assert(nullptr != stream); InternBegin(); } // --------------------------------------------------------------------- ~StreamReader() { - delete[] buffer; + delete[] mBuffer; } // deprecated, use overloaded operator>> instead // --------------------------------------------------------------------- - /** Read a float from the stream */ - float GetF4() - { + /// Read a float from the stream. + float GetF4() { return Get(); } // --------------------------------------------------------------------- - /** Read a double from the stream */ - double GetF8() { + /// Read a double from the stream. + double GetF8() { return Get(); } @@ -136,7 +137,7 @@ public: // --------------------------------------------------------------------- /** Read a signed 8 bit integer from the stream */ - int8_t GetI1() { + int8_t GetI1() { return Get(); } @@ -154,55 +155,55 @@ public: // --------------------------------------------------------------------- /** Read a unsigned 16 bit integer from the stream */ - uint16_t GetU2() { + uint16_t GetU2() { return Get(); } // --------------------------------------------------------------------- - /** Read a unsigned 8 bit integer from the stream */ + /// Read a unsigned 8 bit integer from the stream uint8_t GetU1() { return Get(); } // --------------------------------------------------------------------- - /** Read an unsigned 32 bit integer from the stream */ - uint32_t GetU4() { + /// Read an unsigned 32 bit integer from the stream + uint32_t GetU4() { return Get(); } // --------------------------------------------------------------------- - /** Read a unsigned 64 bit integer from the stream */ - uint64_t GetU8() { + /// Read a unsigned 64 bit integer from the stream + uint64_t GetU8() { return Get(); } // --------------------------------------------------------------------- - /** Get the remaining stream size (to the end of the stream) */ - unsigned int GetRemainingSize() const { - return (unsigned int)(end - current); + /// Get the remaining stream size (to the end of the stream) + size_t GetRemainingSize() const { + return (unsigned int)(mEnd - mCurrent); } // --------------------------------------------------------------------- /** Get the remaining stream size (to the current read limit). The * return value is the remaining size of the stream if no custom * read limit has been set. */ - unsigned int GetRemainingSizeToLimit() const { - return (unsigned int)(limit - current); + size_t GetRemainingSizeToLimit() const { + return (unsigned int)(mLimit - mCurrent); } // --------------------------------------------------------------------- /** Increase the file pointer (relative seeking) */ - void IncPtr(intptr_t plus) { - current += plus; - if (current > limit) { + void IncPtr(intptr_t plus) { + mCurrent += plus; + if (mCurrent > mLimit) { throw DeadlyImportError("End of file or read limit was reached"); } } // --------------------------------------------------------------------- /** Get the current file pointer */ - int8_t* GetPtr() const { - return current; + int8_t *GetPtr() const { + return mCurrent; } // --------------------------------------------------------------------- @@ -211,9 +212,9 @@ public: * large chunks of data at once. * @param p The new pointer, which is validated against the size * limit and buffer boundaries. */ - void SetPtr(int8_t* p) { - current = p; - if (current > limit || current < buffer) { + void SetPtr(int8_t *p) { + mCurrent = p; + if (mCurrent > mLimit || mCurrent < mBuffer) { throw DeadlyImportError("End of file or read limit was reached"); } } @@ -222,21 +223,20 @@ public: /** Copy n bytes to an external buffer * @param out Destination for copying * @param bytes Number of bytes to copy */ - void CopyAndAdvance(void* out, size_t bytes) { - int8_t* ur = GetPtr(); - SetPtr(ur+bytes); // fire exception if eof + void CopyAndAdvance(void *out, size_t bytes) { + int8_t *ur = GetPtr(); + SetPtr(ur + bytes); // fire exception if eof - ::memcpy(out,ur,bytes); + ::memcpy(out, ur, bytes); } - // --------------------------------------------------------------------- - /** Get the current offset from the beginning of the file */ - int GetCurrentPos() const { - return (unsigned int)(current - buffer); + /// @brief Get the current offset from the beginning of the file + int GetCurrentPos() const { + return (unsigned int)(mCurrent - mBuffer); } void SetCurrentPos(size_t pos) { - SetPtr(buffer + pos); + SetPtr(mBuffer + pos); } // --------------------------------------------------------------------- @@ -246,15 +246,15 @@ public: * the beginning of the file. Specifying UINT_MAX * resets the limit to the original end of the stream. * Returns the previously set limit. */ - unsigned int SetReadLimit(unsigned int _limit) { + unsigned int SetReadLimit(unsigned int _limit) { unsigned int prev = GetReadLimit(); if (UINT_MAX == _limit) { - limit = end; + mLimit = mEnd; return prev; } - limit = buffer + _limit; - if (limit > end) { + mLimit = mBuffer + _limit; + if (mLimit > mEnd) { throw DeadlyImportError("StreamReader: Invalid read limit"); } return prev; @@ -263,21 +263,21 @@ public: // --------------------------------------------------------------------- /** Get the current read limit in bytes. Reading over this limit * accidentally raises an exception. */ - unsigned int GetReadLimit() const { - return (unsigned int)(limit - buffer); + unsigned int GetReadLimit() const { + return (unsigned int)(mLimit - mBuffer); } // --------------------------------------------------------------------- /** Skip to the read limit in bytes. Reading over this limit * accidentally raises an exception. */ - void SkipToReadLimit() { - current = limit; + void SkipToReadLimit() { + mCurrent = mLimit; } // --------------------------------------------------------------------- /** overload operator>> and allow chaining of >> ops. */ template - StreamReader& operator >> (T& f) { + StreamReader &operator>>(T &f) { f = Get(); return *this; } @@ -286,14 +286,14 @@ public: /** Generic read method. ByteSwap::Swap(T*) *must* be defined */ template T Get() { - if ( current + sizeof(T) > limit) { + if (mCurrent + sizeof(T) > mLimit) { throw DeadlyImportError("End of file or stream limit was reached"); } T f; - ::memcpy (&f, current, sizeof(T)); - Intern::Getter() (&f,le); - current += sizeof(T); + ::memcpy(&f, mCurrent, sizeof(T)); + Intern::Getter()(&f, mLe); + mCurrent += sizeof(T); return f; } @@ -301,46 +301,44 @@ public: private: // --------------------------------------------------------------------- void InternBegin() { - if (!stream) { - // in case someone wonders: StreamReader is frequently invoked with - // no prior validation whether the input stream is valid. Since - // no one bothers changing the error message, this message here - // is passed down to the caller and 'unable to open file' - // simply describes best what happened. + if (nullptr == mStream) { throw DeadlyImportError("StreamReader: Unable to open file"); } - const size_t s = stream->FileSize() - stream->Tell(); - if (!s) { + const size_t filesize = mStream->FileSize() - mStream->Tell(); + if (0 == filesize) { throw DeadlyImportError("StreamReader: File is empty or EOF is already reached"); } - current = buffer = new int8_t[s]; - const size_t read = stream->Read(current,1,s); + mCurrent = mBuffer = new int8_t[filesize]; + const size_t read = mStream->Read(mCurrent, 1, filesize); // (read < s) can only happen if the stream was opened in text mode, in which case FileSize() is not reliable - ai_assert(read <= s); - end = limit = &buffer[read-1] + 1; + ai_assert(read <= filesize); + mEnd = mLimit = &mBuffer[read - 1] + 1; } private: - std::shared_ptr stream; - int8_t *buffer, *current, *end, *limit; - bool le; + std::shared_ptr mStream; + int8_t *mBuffer; + int8_t *mCurrent; + int8_t *mEnd; + int8_t *mLimit; + bool mLe; }; // -------------------------------------------------------------------------------------------- // `static` StreamReaders. Their byte order is fixed and they might be a little bit faster. #ifdef AI_BUILD_BIG_ENDIAN - typedef StreamReader StreamReaderLE; - typedef StreamReader StreamReaderBE; +typedef StreamReader StreamReaderLE; +typedef StreamReader StreamReaderBE; #else - typedef StreamReader StreamReaderBE; - typedef StreamReader StreamReaderLE; +typedef StreamReader StreamReaderBE; +typedef StreamReader StreamReaderLE; #endif // `dynamic` StreamReader. The byte order of the input data is specified in the // c'tor. This involves runtime branching and might be a little bit slower. -typedef StreamReader StreamReaderAny; +typedef StreamReader StreamReaderAny; } // end namespace Assimp diff --git a/include/assimp/StringUtils.h b/include/assimp/StringUtils.h index 894eada60..7e1cb4ce0 100644 --- a/include/assimp/StringUtils.h +++ b/include/assimp/StringUtils.h @@ -145,4 +145,21 @@ std::string DecimalToHexa( T toConvert ) { return result; } +/// @brief translate RGBA to String +/// @param r aiColor.r +/// @param g aiColor.g +/// @param b aiColor.b +/// @param a aiColor.a +/// @param with_head # +/// @return The hexadecimal string, is empty in case of an error. +AI_FORCE_INLINE std::string Rgba2Hex(int r, int g, int b, int a, bool with_head) { + std::stringstream ss; + if (with_head) { + ss << "#"; + } + ss << std::hex << (r << 24 | g << 16 | b << 8 | a); + + return ss.str(); +} + #endif // INCLUDED_AI_STRINGUTILS_H diff --git a/include/assimp/camera.h b/include/assimp/camera.h index 2001a9354..c1ac36b27 100644 --- a/include/assimp/camera.h +++ b/include/assimp/camera.h @@ -171,15 +171,26 @@ struct aiCamera */ float mAspect; + /** Half horizontal orthographic width, in scene units. + * + * The orthographic width specifies the half width of the + * orthographic view box. If non-zero the camera is + * orthographic and the mAspect should define to the + * ratio between the orthographic width and height + * and mHorizontalFOV should be set to 0. + * The default value is 0 (not orthographic). + */ + float mOrthographicWidth; #ifdef __cplusplus aiCamera() AI_NO_EXCEPT - : mUp (0.f,1.f,0.f) - , mLookAt (0.f,0.f,1.f) - , mHorizontalFOV (0.25f * (float)AI_MATH_PI) - , mClipPlaneNear (0.1f) - , mClipPlaneFar (1000.f) - , mAspect (0.f) + : mUp (0.f,1.f,0.f) + , mLookAt (0.f,0.f,1.f) + , mHorizontalFOV (0.25f * (float)AI_MATH_PI) + , mClipPlaneNear (0.1f) + , mClipPlaneFar (1000.f) + , mAspect (0.f) + , mOrthographicWidth (0.f) {} /** @brief Get a *right-handed* camera matrix from me diff --git a/include/assimp/metadata.h b/include/assimp/metadata.h index bddd04b1e..28ddce567 100644 --- a/include/assimp/metadata.h +++ b/include/assimp/metadata.h @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2020, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -49,29 +47,29 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define AI_METADATA_H_INC #ifdef __GNUC__ -# pragma GCC system_header +#pragma GCC system_header #endif #if defined(_MSC_VER) && (_MSC_VER <= 1500) -# include "Compiler/pstdint.h" +#include "Compiler/pstdint.h" #else -# include +#include #endif // ------------------------------------------------------------------------------- /** * Enum used to distinguish data types */ - // ------------------------------------------------------------------------------- +// ------------------------------------------------------------------------------- typedef enum aiMetadataType { - AI_BOOL = 0, - AI_INT32 = 1, - AI_UINT64 = 2, - AI_FLOAT = 3, - AI_DOUBLE = 4, - AI_AISTRING = 5, + AI_BOOL = 0, + AI_INT32 = 1, + AI_UINT64 = 2, + AI_FLOAT = 3, + AI_DOUBLE = 4, + AI_AISTRING = 5, AI_AIVECTOR3D = 6, - AI_META_MAX = 7, + AI_META_MAX = 7, #ifndef SWIG FORCE_32BIT = INT_MAX @@ -84,10 +82,10 @@ typedef enum aiMetadataType { * * The type field uniquely identifies the underlying type of the data field */ - // ------------------------------------------------------------------------------- +// ------------------------------------------------------------------------------- struct aiMetadataEntry { aiMetadataType mType; - void* mData; + void *mData; }; #ifdef __cplusplus @@ -98,15 +96,29 @@ struct aiMetadataEntry { /** * Helper functions to get the aiType enum entry for a type */ - // ------------------------------------------------------------------------------- +// ------------------------------------------------------------------------------- -inline aiMetadataType GetAiType( bool ) { return AI_BOOL; } -inline aiMetadataType GetAiType( int32_t ) { return AI_INT32; } -inline aiMetadataType GetAiType( uint64_t ) { return AI_UINT64; } -inline aiMetadataType GetAiType( float ) { return AI_FLOAT; } -inline aiMetadataType GetAiType( double ) { return AI_DOUBLE; } -inline aiMetadataType GetAiType( const aiString & ) { return AI_AISTRING; } -inline aiMetadataType GetAiType( const aiVector3D & ) { return AI_AIVECTOR3D; } +inline aiMetadataType GetAiType(bool) { + return AI_BOOL; +} +inline aiMetadataType GetAiType(int32_t) { + return AI_INT32; +} +inline aiMetadataType GetAiType(uint64_t) { + return AI_UINT64; +} +inline aiMetadataType GetAiType(float) { + return AI_FLOAT; +} +inline aiMetadataType GetAiType(double) { + return AI_DOUBLE; +} +inline aiMetadataType GetAiType(const aiString &) { + return AI_AISTRING; +} +inline aiMetadataType GetAiType(const aiVector3D &) { + return AI_AIVECTOR3D; +} #endif // __cplusplus @@ -116,17 +128,17 @@ inline aiMetadataType GetAiType( const aiVector3D & ) { return AI_AIVECTOR3D; } * * Metadata is a key-value store using string keys and values. */ - // ------------------------------------------------------------------------------- +// ------------------------------------------------------------------------------- struct aiMetadata { /** Length of the mKeys and mValues arrays, respectively */ unsigned int mNumProperties; /** Arrays of keys, may not be NULL. Entries in this array may not be NULL as well. */ - C_STRUCT aiString* mKeys; + C_STRUCT aiString *mKeys; /** Arrays of values, may not be NULL. Entries in this array may be NULL if the * corresponding property key has no assigned value. */ - C_STRUCT aiMetadataEntry* mValues; + C_STRUCT aiMetadataEntry *mValues; #ifdef __cplusplus @@ -134,71 +146,62 @@ struct aiMetadata { * @brief The default constructor, set all members to zero by default. */ aiMetadata() AI_NO_EXCEPT - : mNumProperties(0) - , mKeys(nullptr) - , mValues(nullptr) { + : mNumProperties(0), + mKeys(nullptr), + mValues(nullptr) { // empty } - aiMetadata( const aiMetadata &rhs ) - : mNumProperties( rhs.mNumProperties ) - , mKeys( nullptr ) - , mValues( nullptr ) { - mKeys = new aiString[ mNumProperties ]; - for ( size_t i = 0; i < static_cast( mNumProperties ); ++i ) { - mKeys[ i ] = rhs.mKeys[ i ]; + aiMetadata(const aiMetadata &rhs) : + mNumProperties(rhs.mNumProperties), mKeys(nullptr), mValues(nullptr) { + mKeys = new aiString[mNumProperties]; + for (size_t i = 0; i < static_cast(mNumProperties); ++i) { + mKeys[i] = rhs.mKeys[i]; } - mValues = new aiMetadataEntry[ mNumProperties ]; - for ( size_t i = 0; i < static_cast(mNumProperties); ++i ) { - mValues[ i ].mType = rhs.mValues[ i ].mType; - switch ( rhs.mValues[ i ].mType ) { + mValues = new aiMetadataEntry[mNumProperties]; + for (size_t i = 0; i < static_cast(mNumProperties); ++i) { + mValues[i].mType = rhs.mValues[i].mType; + switch (rhs.mValues[i].mType) { case AI_BOOL: - mValues[ i ].mData = new bool; - ::memcpy( mValues[ i ].mData, rhs.mValues[ i ].mData, sizeof(bool) ); + mValues[i].mData = new bool; + ::memcpy(mValues[i].mData, rhs.mValues[i].mData, sizeof(bool)); break; case AI_INT32: { int32_t v; - ::memcpy( &v, rhs.mValues[ i ].mData, sizeof( int32_t ) ); - mValues[ i ].mData = new int32_t( v ); - } - break; + ::memcpy(&v, rhs.mValues[i].mData, sizeof(int32_t)); + mValues[i].mData = new int32_t(v); + } break; case AI_UINT64: { - uint64_t v; - ::memcpy( &v, rhs.mValues[ i ].mData, sizeof( uint64_t ) ); - mValues[ i ].mData = new uint64_t( v ); - } - break; + uint64_t v; + ::memcpy(&v, rhs.mValues[i].mData, sizeof(uint64_t)); + mValues[i].mData = new uint64_t(v); + } break; case AI_FLOAT: { - float v; - ::memcpy( &v, rhs.mValues[ i ].mData, sizeof( float ) ); - mValues[ i ].mData = new float( v ); - } - break; + float v; + ::memcpy(&v, rhs.mValues[i].mData, sizeof(float)); + mValues[i].mData = new float(v); + } break; case AI_DOUBLE: { - double v; - ::memcpy( &v, rhs.mValues[ i ].mData, sizeof( double ) ); - mValues[ i ].mData = new double( v ); - } - break; + double v; + ::memcpy(&v, rhs.mValues[i].mData, sizeof(double)); + mValues[i].mData = new double(v); + } break; case AI_AISTRING: { - aiString v; - rhs.Get( mKeys[ i ], v ); - mValues[ i ].mData = new aiString( v ); - } - break; + aiString v; + rhs.Get(mKeys[i], v); + mValues[i].mData = new aiString(v); + } break; case AI_AIVECTOR3D: { - aiVector3D v; - rhs.Get( mKeys[ i ], v ); - mValues[ i ].mData = new aiVector3D( v ); - } - break; + aiVector3D v; + rhs.Get(mKeys[i], v); + mValues[i].mData = new aiVector3D(v); + } break; #ifndef SWIG case FORCE_32BIT: #endif default: break; } - } } @@ -206,33 +209,33 @@ struct aiMetadata { * @brief The destructor. */ ~aiMetadata() { - delete [] mKeys; + delete[] mKeys; mKeys = nullptr; if (mValues) { // Delete each metadata entry - for (unsigned i=0; i( data ); + delete static_cast(data); break; case AI_INT32: - delete static_cast< int32_t* >( data ); + delete static_cast(data); break; case AI_UINT64: - delete static_cast< uint64_t* >( data ); + delete static_cast(data); break; case AI_FLOAT: - delete static_cast< float* >( data ); + delete static_cast(data); break; case AI_DOUBLE: - delete static_cast< double* >( data ); + delete static_cast(data); break; case AI_AISTRING: - delete static_cast< aiString* >( data ); + delete static_cast(data); break; case AI_AIVECTOR3D: - delete static_cast< aiVector3D* >( data ); + delete static_cast(data); break; #ifndef SWIG case FORCE_32BIT: @@ -243,7 +246,7 @@ struct aiMetadata { } // Delete the metadata array - delete [] mValues; + delete[] mValues; mValues = nullptr; } } @@ -252,16 +255,15 @@ struct aiMetadata { * @brief Allocates property fields + keys. * @param numProperties Number of requested properties. */ - static inline - aiMetadata *Alloc( unsigned int numProperties ) { - if ( 0 == numProperties ) { + static inline aiMetadata *Alloc(unsigned int numProperties) { + if (0 == numProperties) { return nullptr; } aiMetadata *data = new aiMetadata; data->mNumProperties = numProperties; - data->mKeys = new aiString[ data->mNumProperties ](); - data->mValues = new aiMetadataEntry[ data->mNumProperties ](); + data->mKeys = new aiString[data->mNumProperties](); + data->mValues = new aiMetadataEntry[data->mNumProperties](); return data; } @@ -269,44 +271,40 @@ struct aiMetadata { /** * @brief Deallocates property fields + keys. */ - static inline - void Dealloc( aiMetadata *metadata ) { + static inline void Dealloc(aiMetadata *metadata) { delete metadata; } - template - inline - void Add(const std::string& key, const T& value) { - aiString* new_keys = new aiString[mNumProperties + 1]; - aiMetadataEntry* new_values = new aiMetadataEntry[mNumProperties + 1]; + template + inline void Add(const std::string &key, const T &value) { + aiString *new_keys = new aiString[mNumProperties + 1]; + aiMetadataEntry *new_values = new aiMetadataEntry[mNumProperties + 1]; - for(unsigned int i = 0; i < mNumProperties; ++i) - { - new_keys[i] = mKeys[i]; - new_values[i] = mValues[i]; - } + for (unsigned int i = 0; i < mNumProperties; ++i) { + new_keys[i] = mKeys[i]; + new_values[i] = mValues[i]; + } - delete[] mKeys; - delete[] mValues; + delete[] mKeys; + delete[] mValues; - mKeys = new_keys; - mValues = new_values; + mKeys = new_keys; + mValues = new_values; - mNumProperties++; + mNumProperties++; - Set(mNumProperties - 1, key, value); - } + Set(mNumProperties - 1, key, value); + } - template - inline - bool Set( unsigned index, const std::string& key, const T& value ) { + template + inline bool Set(unsigned index, const std::string &key, const T &value) { // In range assertion - if ( index >= mNumProperties ) { + if (index >= mNumProperties) { return false; } // Ensure that we have a valid key. - if ( key.empty() ) { + if (key.empty()) { return false; } @@ -321,73 +319,86 @@ struct aiMetadata { return true; } - template - inline - bool Get( unsigned index, T& value ) const { + template + inline bool Set( const std::string &key, const T &value ) { + if (key.empty()) { + return false; + } + + bool result = false; + for (unsigned int i = 0; i < mNumProperties; ++i) { + if (key == mKeys[i].C_Str()) { + Set(i, key, value); + result = true; + break; + } + } + + return result; + } + + template + inline bool Get(unsigned index, T &value) const { // In range assertion - if ( index >= mNumProperties ) { + if (index >= mNumProperties) { return false; } // Return false if the output data type does // not match the found value's data type - if ( GetAiType( value ) != mValues[ index ].mType ) { + if (GetAiType(value) != mValues[index].mType) { return false; } // Otherwise, output the found value and // return true - value = *static_cast(mValues[index].mData); + value = *static_cast(mValues[index].mData); return true; } - template - inline - bool Get( const aiString& key, T& value ) const { + template + inline bool Get(const aiString &key, T &value) const { // Search for the given key - for ( unsigned int i = 0; i < mNumProperties; ++i ) { - if ( mKeys[ i ] == key ) { - return Get( i, value ); + for (unsigned int i = 0; i < mNumProperties; ++i) { + if (mKeys[i] == key) { + return Get(i, value); } } return false; } - template - inline - bool Get( const std::string& key, T& value ) const { + template + inline bool Get(const std::string &key, T &value) const { return Get(aiString(key), value); } - /// Return metadata entry for analyzing it by user. - /// \param [in] pIndex - index of the entry. - /// \param [out] pKey - pointer to the key value. - /// \param [out] pEntry - pointer to the entry: type and value. - /// \return false - if pIndex is out of range, else - true. - inline - bool Get(size_t index, const aiString*& key, const aiMetadataEntry*& entry) const { - if ( index >= mNumProperties ) { + /// Return metadata entry for analyzing it by user. + /// \param [in] pIndex - index of the entry. + /// \param [out] pKey - pointer to the key value. + /// \param [out] pEntry - pointer to the entry: type and value. + /// \return false - if pIndex is out of range, else - true. + inline bool Get(size_t index, const aiString *&key, const aiMetadataEntry *&entry) const { + if (index >= mNumProperties) { return false; } - key = &mKeys[index]; - entry = &mValues[index]; + key = &mKeys[index]; + entry = &mValues[index]; - return true; - } + return true; + } /// Check whether there is a metadata entry for the given key. /// \param [in] Key - the key value value to check for. - inline - bool HasKey(const char* key) { - if ( nullptr == key ) { + inline bool HasKey(const char *key) { + if (nullptr == key) { return false; } - + // Search for the given key for (unsigned int i = 0; i < mNumProperties; ++i) { - if ( 0 == strncmp(mKeys[i].C_Str(), key, mKeys[i].length ) ) { + if (0 == strncmp(mKeys[i].C_Str(), key, mKeys[i].length)) { return true; } } @@ -395,7 +406,6 @@ struct aiMetadata { } #endif // __cplusplus - }; #endif // AI_METADATA_H_INC diff --git a/packaging/windows-innosetup/script_x64.iss b/packaging/windows-innosetup/script_x64.iss index 4d1b67cd0..7b49eba63 100644 --- a/packaging/windows-innosetup/script_x64.iss +++ b/packaging/windows-innosetup/script_x64.iss @@ -2,7 +2,7 @@ [Setup] AppName=Open Asset Import Library - SDK -AppVerName=Open Asset Import Library - SDK (v5.0.0) +AppVerName=Open Asset Import Library - SDK (v5.0.1) DefaultDirName={pf}\Assimp DefaultGroupName=Assimp UninstallDisplayIcon={app}\bin\x64\assimp.exe @@ -12,9 +12,9 @@ SetupIconFile=..\..\tools\shared\assimp_tools_icon.ico WizardImageFile=compiler:WizModernImage-IS.BMP WizardSmallImageFile=compiler:WizModernSmallImage-IS.BMP LicenseFile=License.rtf -OutputBaseFileName=assimp-sdk-5.0.0-setup -VersionInfoVersion=5.0.0.0 -VersionInfoTextVersion=5.0.0 +OutputBaseFileName=assimp-sdk-5.0.1-setup +VersionInfoVersion=5.0.1.0 +VersionInfoTextVersion=5.0.1 VersionInfoCompany=Assimp Development Team ArchitecturesInstallIn64BitMode=x64 diff --git a/packaging/windows-innosetup/script_x86.iss b/packaging/windows-innosetup/script_x86.iss index d22d23b64..e8f591bbe 100644 --- a/packaging/windows-innosetup/script_x86.iss +++ b/packaging/windows-innosetup/script_x86.iss @@ -2,7 +2,7 @@ [Setup] AppName=Open Asset Import Library - SDK -AppVerName=Open Asset Import Library - SDK (v5.0.0) +AppVerName=Open Asset Import Library - SDK (v5.0.1) DefaultDirName={pf}\Assimp DefaultGroupName=Assimp UninstallDisplayIcon={app}\bin\x86\assimp.exe @@ -12,9 +12,9 @@ SetupIconFile=..\..\tools\shared\assimp_tools_icon.ico WizardImageFile=compiler:WizModernImage-IS.BMP WizardSmallImageFile=compiler:WizModernSmallImage-IS.BMP LicenseFile=License.rtf -OutputBaseFileName=assimp-sdk-5.0.0-setup -VersionInfoVersion=4.1.0.0 -VersionInfoTextVersion=4.1.0 +OutputBaseFileName=assimp-sdk-5.0.1-setup +VersionInfoVersion=5.0.1.0 +VersionInfoTextVersion=5.0.1 VersionInfoCompany=Assimp Development Team ;ArchitecturesInstallIn64BitMode=x64 diff --git a/samples/SimpleOpenGL/CMakeLists.txt b/samples/SimpleOpenGL/CMakeLists.txt index 39593fdb9..6bc8e37e6 100644 --- a/samples/SimpleOpenGL/CMakeLists.txt +++ b/samples/SimpleOpenGL/CMakeLists.txt @@ -1,3 +1,5 @@ +SET(SAMPLE_PROJECT_NAME assimp_simpleogl) + FIND_PACKAGE(OpenGL) FIND_PACKAGE(GLUT) IF ( MSVC ) @@ -16,6 +18,10 @@ IF ( NOT GLUT_FOUND ) ENDIF () ENDIF () +# Used for usage and error messages in the program. +ADD_COMPILE_DEFINITIONS(ASSIMP_VERSION="${ASSIMP_VERSION}") +ADD_COMPILE_DEFINITIONS(PROJECT_NAME="${SAMPLE_PROJECT_NAME}") + if ( MSVC ) ADD_DEFINITIONS( -D_SCL_SECURE_NO_WARNINGS ) ADD_DEFINITIONS( -D_CRT_SECURE_NO_WARNINGS ) @@ -34,17 +40,17 @@ LINK_DIRECTORIES( ${Assimp_BINARY_DIR}/lib ) -ADD_EXECUTABLE( assimp_simpleogl +ADD_EXECUTABLE( ${SAMPLE_PROJECT_NAME} Sample_SimpleOpenGL.c ) -SET_PROPERTY(TARGET assimp_simpleogl PROPERTY DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX}) +SET_PROPERTY(TARGET ${SAMPLE_PROJECT_NAME} PROPERTY DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX}) -TARGET_LINK_LIBRARIES( assimp_simpleogl assimp ${OPENGL_LIBRARIES} ${GLUT_LIBRARIES} ${M_LIB} ) -SET_TARGET_PROPERTIES( assimp_simpleogl PROPERTIES - OUTPUT_NAME assimp_simpleogl +TARGET_LINK_LIBRARIES( ${SAMPLE_PROJECT_NAME} assimp ${OPENGL_LIBRARIES} ${GLUT_LIBRARIES} ${M_LIB} ) +SET_TARGET_PROPERTIES( ${SAMPLE_PROJECT_NAME} PROPERTIES + OUTPUT_NAME ${SAMPLE_PROJECT_NAME} ) -INSTALL( TARGETS assimp_simpleogl +INSTALL( TARGETS ${SAMPLE_PROJECT_NAME} DESTINATION "${ASSIMP_BIN_INSTALL_DIR}" COMPONENT assimp-dev ) diff --git a/samples/SimpleOpenGL/Sample_SimpleOpenGL.c b/samples/SimpleOpenGL/Sample_SimpleOpenGL.c index a8a3532cf..bcc964efe 100644 --- a/samples/SimpleOpenGL/Sample_SimpleOpenGL.c +++ b/samples/SimpleOpenGL/Sample_SimpleOpenGL.c @@ -15,9 +15,9 @@ #include #ifdef __APPLE__ -#include +#include #else -#include +#include #endif /* assimp include files. These three are usually needed. */ @@ -25,6 +25,39 @@ #include #include +#define COMMAND_USAGE "--usage" + +/* ---------------------------------------------------------------------------- */ +inline static void print_run_command(const char* command_name) { + printf("Run '%s %s' for more information.\n", + PROJECT_NAME, command_name); +} + +/* ---------------------------------------------------------------------------- */ +inline static void print_error(const char* msg) { + printf("ERROR: %s\n", msg); +} + +#define NEW_LINE "\n" +#define DOUBLE_NEW_LINE NEW_LINE NEW_LINE + +/* ---------------------------------------------------------------------------- */ +inline static void print_usage() { + static const char* usage_format = + "Usage: " + PROJECT_NAME + " " DOUBLE_NEW_LINE + "where:" DOUBLE_NEW_LINE + " %-10s %s" DOUBLE_NEW_LINE + "options:" DOUBLE_NEW_LINE + " %-10s %s" DOUBLE_NEW_LINE; + printf(usage_format, + // where + "file", "The input model file to load.", + // options + COMMAND_USAGE, "Display usage."); +} + /* the global Assimp scene object */ const C_STRUCT aiScene* scene = NULL; GLuint scene_list = 0; @@ -245,7 +278,7 @@ void do_motion (void) static int frames = 0; int time = glutGet(GLUT_ELAPSED_TIME); - angle += (time-prev_time)*0.01; + angle += static_cast((time-prev_time)*0.01); prev_time = time; frames += 1; @@ -324,12 +357,42 @@ int loadasset (const char* path) /* ---------------------------------------------------------------------------- */ int main(int argc, char **argv) { + const char* model_file = NULL; C_STRUCT aiLogStream stream; + if (argc < 2) { + print_error("No input model file specifed."); + print_run_command(COMMAND_USAGE); + return EXIT_FAILURE; + } + + // Find and execute available commands entered by the user. + for (int i = 1; i < argc; ++i) { + if (!strncmp(argv[i], COMMAND_USAGE, strlen(COMMAND_USAGE))) { + print_usage(); + return EXIT_SUCCESS; + } + } + + // Check and validate the specified model file extension. + model_file = argv[1]; + const char* extension = strchr(model_file, '.'); + if (!extension) { + print_error("Please provide a file with a valid extension."); + return EXIT_FAILURE; + } + + if (AI_FALSE == aiIsExtensionSupported(extension)) { + print_error("The specified model file extension is currently " + "unsupported in Assimp " ASSIMP_VERSION "."); + return EXIT_FAILURE; + } + glutInitWindowSize(900,600); glutInitWindowPosition(100,100); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutInit(&argc, argv); + glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS); glutCreateWindow("Assimp - Very simple OpenGL sample"); glutDisplayFunc(display); @@ -346,14 +409,11 @@ int main(int argc, char **argv) stream = aiGetPredefinedLogStream(aiDefaultLogStream_FILE,"assimp_log.txt"); aiAttachLogStream(&stream); - /* the model name can be specified on the command line. If none - is specified, we try to locate one of the more expressive test - models from the repository (/models-nonbsd may be missing in - some distributions so we need a fallback from /models!). */ - if( 0 != loadasset( argc >= 2 ? argv[1] : "../../test/models-nonbsd/X/dwarf.x")) { - if( argc != 1 || (0 != loadasset( "../../../../test/models-nonbsd/X/dwarf.x") && 0 != loadasset( "../../test/models/X/Testwuson.X"))) { - return -1; - } + // Load the model file. + if(0 != loadasset(model_file)) { + print_error("Failed to load model. Please ensure that the specified file exists."); + aiDetachAllLogStreams(); + return EXIT_FAILURE; } glClearColor(0.1f,0.1f,0.1f,1.f); @@ -384,5 +444,5 @@ int main(int argc, char **argv) again. This will definitely release the last resources allocated by Assimp.*/ aiDetachAllLogStreams(); - return 0; + return EXIT_SUCCESS; } diff --git a/samples/SimpleTexturedDirectx11/SimpleTexturedDirectx11/Mesh.h b/samples/SimpleTexturedDirectx11/SimpleTexturedDirectx11/Mesh.h index 125b3e585..e0169ee1a 100644 --- a/samples/SimpleTexturedDirectx11/SimpleTexturedDirectx11/Mesh.h +++ b/samples/SimpleTexturedDirectx11/SimpleTexturedDirectx11/Mesh.h @@ -31,40 +31,40 @@ struct Texture { class Mesh { public: - std::vector vertices; - std::vector indices; - std::vector textures; - ID3D11Device *dev; + std::vector vertices_; + std::vector indices_; + std::vector textures_; + ID3D11Device *dev_; Mesh(ID3D11Device *dev, const std::vector& vertices, const std::vector& indices, const std::vector& textures) : - vertices(vertices), - indices(indices), - textures(textures), - dev(dev), - VertexBuffer(nullptr), - IndexBuffer(nullptr) { - this->setupMesh(this->dev); + vertices_(vertices), + indices_(indices), + textures_(textures), + dev_(dev), + VertexBuffer_(nullptr), + IndexBuffer_(nullptr) { + this->setupMesh(this->dev_); } void Draw(ID3D11DeviceContext *devcon) { UINT stride = sizeof(VERTEX); UINT offset = 0; - devcon->IASetVertexBuffers(0, 1, &VertexBuffer, &stride, &offset); - devcon->IASetIndexBuffer(IndexBuffer, DXGI_FORMAT_R32_UINT, 0); + devcon->IASetVertexBuffers(0, 1, &VertexBuffer_, &stride, &offset); + devcon->IASetIndexBuffer(IndexBuffer_, DXGI_FORMAT_R32_UINT, 0); - devcon->PSSetShaderResources(0, 1, &textures[0].texture); + devcon->PSSetShaderResources(0, 1, &textures_[0].texture); - devcon->DrawIndexed(static_cast(indices.size()), 0, 0); + devcon->DrawIndexed(static_cast(indices_.size()), 0, 0); } void Close() { - SafeRelease(VertexBuffer); - SafeRelease(IndexBuffer); + SafeRelease(VertexBuffer_); + SafeRelease(IndexBuffer_); } private: // Render data - ID3D11Buffer *VertexBuffer, *IndexBuffer; + ID3D11Buffer *VertexBuffer_, *IndexBuffer_; // Functions // Initializes all the buffer objects/arrays @@ -73,15 +73,15 @@ private: D3D11_BUFFER_DESC vbd; vbd.Usage = D3D11_USAGE_IMMUTABLE; - vbd.ByteWidth = static_cast(sizeof(VERTEX) * vertices.size()); + vbd.ByteWidth = static_cast(sizeof(VERTEX) * vertices_.size()); vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER; vbd.CPUAccessFlags = 0; vbd.MiscFlags = 0; D3D11_SUBRESOURCE_DATA initData; - initData.pSysMem = &vertices[0]; + initData.pSysMem = &vertices_[0]; - hr = dev->CreateBuffer(&vbd, &initData, &VertexBuffer); + hr = dev->CreateBuffer(&vbd, &initData, &VertexBuffer_); if (FAILED(hr)) { Close(); throw std::runtime_error("Failed to create vertex buffer."); @@ -89,14 +89,14 @@ private: D3D11_BUFFER_DESC ibd; ibd.Usage = D3D11_USAGE_IMMUTABLE; - ibd.ByteWidth = static_cast(sizeof(UINT) * indices.size()); + ibd.ByteWidth = static_cast(sizeof(UINT) * indices_.size()); ibd.BindFlags = D3D11_BIND_INDEX_BUFFER; ibd.CPUAccessFlags = 0; ibd.MiscFlags = 0; - initData.pSysMem = &indices[0]; + initData.pSysMem = &indices_[0]; - hr = dev->CreateBuffer(&ibd, &initData, &IndexBuffer); + hr = dev->CreateBuffer(&ibd, &initData, &IndexBuffer_); if (FAILED(hr)) { Close(); throw std::runtime_error("Failed to create index buffer."); diff --git a/samples/SimpleTexturedDirectx11/SimpleTexturedDirectx11/ModelLoader.cpp b/samples/SimpleTexturedDirectx11/SimpleTexturedDirectx11/ModelLoader.cpp index 806320144..733d3d620 100644 --- a/samples/SimpleTexturedDirectx11/SimpleTexturedDirectx11/ModelLoader.cpp +++ b/samples/SimpleTexturedDirectx11/SimpleTexturedDirectx11/ModelLoader.cpp @@ -1,12 +1,12 @@ #include "ModelLoader.h" ModelLoader::ModelLoader() : - dev(nullptr), - devcon(nullptr), - meshes(), - directory(), - textures_loaded(), - hwnd(nullptr) { + dev_(nullptr), + devcon_(nullptr), + meshes_(), + directory_(), + textures_loaded_(), + hwnd_(nullptr) { // empty } @@ -22,14 +22,14 @@ bool ModelLoader::Load(HWND hwnd, ID3D11Device * dev, ID3D11DeviceContext * devc aiProcess_Triangulate | aiProcess_ConvertToLeftHanded); - if (pScene == NULL) + if (pScene == nullptr) return false; - this->directory = filename.substr(0, filename.find_last_of("/\\")); + this->directory_ = filename.substr(0, filename.find_last_of("/\\")); - this->dev = dev; - this->devcon = devcon; - this->hwnd = hwnd; + this->dev_ = dev; + this->devcon_ = devcon; + this->hwnd_ = hwnd; processNode(pScene->mRootNode, pScene); @@ -37,8 +37,8 @@ bool ModelLoader::Load(HWND hwnd, ID3D11Device * dev, ID3D11DeviceContext * devc } void ModelLoader::Draw(ID3D11DeviceContext * devcon) { - for (int i = 0; i < meshes.size(); ++i ) { - meshes[i].Draw(devcon); + for (size_t i = 0; i < meshes_.size(); ++i ) { + meshes_[i].Draw(devcon); } } @@ -88,7 +88,7 @@ Mesh ModelLoader::processMesh(aiMesh * mesh, const aiScene * scene) { textures.insert(textures.end(), diffuseMaps.begin(), diffuseMaps.end()); } - return Mesh(dev, vertices, indices, textures); + return Mesh(dev_, vertices, indices, textures); } std::vector ModelLoader::loadMaterialTextures(aiMaterial * mat, aiTextureType type, std::string typeName, const aiScene * scene) { @@ -98,9 +98,9 @@ std::vector ModelLoader::loadMaterialTextures(aiMaterial * mat, aiTextu mat->GetTexture(type, i, &str); // Check if texture was loaded before and if so, continue to next iteration: skip loading a new texture bool skip = false; - for (UINT j = 0; j < textures_loaded.size(); j++) { - if (std::strcmp(textures_loaded[j].path.c_str(), str.C_Str()) == 0) { - textures.push_back(textures_loaded[j]); + for (UINT j = 0; j < textures_loaded_.size(); j++) { + if (std::strcmp(textures_loaded_[j].path.c_str(), str.C_Str()) == 0) { + textures.push_back(textures_loaded_[j]); skip = true; // A texture with the same filepath has already been loaded, continue to next one. (optimization) break; } @@ -113,34 +113,34 @@ std::vector ModelLoader::loadMaterialTextures(aiMaterial * mat, aiTextu texture.texture = getTextureFromModel(scene, textureindex); } else { std::string filename = std::string(str.C_Str()); - filename = directory + '/' + filename; + filename = directory_ + '/' + filename; std::wstring filenamews = std::wstring(filename.begin(), filename.end()); - hr = CreateWICTextureFromFile(dev, devcon, filenamews.c_str(), nullptr, &texture.texture); + hr = CreateWICTextureFromFile(dev_, devcon_, filenamews.c_str(), nullptr, &texture.texture); if (FAILED(hr)) - MessageBox(hwnd, "Texture couldn't be loaded", "Error!", MB_ICONERROR | MB_OK); + MessageBox(hwnd_, "Texture couldn't be loaded", "Error!", MB_ICONERROR | MB_OK); } texture.type = typeName; texture.path = str.C_Str(); textures.push_back(texture); - this->textures_loaded.push_back(texture); // Store it as texture loaded for entire model, to ensure we won't unnecesery load duplicate textures. + this->textures_loaded_.push_back(texture); // Store it as texture loaded for entire model, to ensure we won't unnecesery load duplicate textures. } } return textures; } void ModelLoader::Close() { - for (auto& t : textures_loaded) + for (auto& t : textures_loaded_) t.Release(); - for (int i = 0; i < meshes.size(); i++) { - meshes[i].Close(); + for (size_t i = 0; i < meshes_.size(); i++) { + meshes_[i].Close(); } } void ModelLoader::processNode(aiNode * node, const aiScene * scene) { for (UINT i = 0; i < node->mNumMeshes; i++) { aiMesh* mesh = scene->mMeshes[node->mMeshes[i]]; - meshes.push_back(this->processMesh(mesh, scene)); + meshes_.push_back(this->processMesh(mesh, scene)); } for (UINT i = 0; i < node->mNumChildren; i++) { @@ -179,9 +179,9 @@ ID3D11ShaderResourceView * ModelLoader::getTextureFromModel(const aiScene * scen int* size = reinterpret_cast(&scene->mTextures[textureindex]->mWidth); - hr = CreateWICTextureFromMemory(dev, devcon, reinterpret_cast(scene->mTextures[textureindex]->pcData), *size, nullptr, &texture); + hr = CreateWICTextureFromMemory(dev_, devcon_, reinterpret_cast(scene->mTextures[textureindex]->pcData), *size, nullptr, &texture); if (FAILED(hr)) - MessageBox(hwnd, "Texture couldn't be created from memory!", "Error!", MB_ICONERROR | MB_OK); + MessageBox(hwnd_, "Texture couldn't be created from memory!", "Error!", MB_ICONERROR | MB_OK); return texture; } diff --git a/samples/SimpleTexturedDirectx11/SimpleTexturedDirectx11/ModelLoader.h b/samples/SimpleTexturedDirectx11/SimpleTexturedDirectx11/ModelLoader.h index 18ad03fa0..9d3ed50b3 100644 --- a/samples/SimpleTexturedDirectx11/SimpleTexturedDirectx11/ModelLoader.h +++ b/samples/SimpleTexturedDirectx11/SimpleTexturedDirectx11/ModelLoader.h @@ -25,12 +25,12 @@ public: void Close(); private: - ID3D11Device *dev; - ID3D11DeviceContext *devcon; - std::vector meshes; - std::string directory; - std::vector textures_loaded; - HWND hwnd; + ID3D11Device *dev_; + ID3D11DeviceContext *devcon_; + std::vector meshes_; + std::string directory_; + std::vector textures_loaded_; + HWND hwnd_; void processNode(aiNode* node, const aiScene* scene); Mesh processMesh(aiMesh* mesh, const aiScene* scene); diff --git a/samples/SimpleTexturedDirectx11/SimpleTexturedDirectx11/main.cpp b/samples/SimpleTexturedDirectx11/SimpleTexturedDirectx11/main.cpp index 781fe89e5..90338105e 100644 --- a/samples/SimpleTexturedDirectx11/SimpleTexturedDirectx11/main.cpp +++ b/samples/SimpleTexturedDirectx11/SimpleTexturedDirectx11/main.cpp @@ -56,7 +56,7 @@ const char g_szClassName[] = "directxWindowClass"; static std::string g_ModelPath; UINT width, height; -HWND hwnd = nullptr; +HWND g_hwnd = nullptr; // ------------------------------------------------------------ // DirectX Variables @@ -120,13 +120,13 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) return 0; } -int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, - LPWSTR lpCmdLine, int nCmdShow) +int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, + LPWSTR /*lpCmdLine*/, int nCmdShow) { int argc; LPWSTR* argv = CommandLineToArgvW(GetCommandLineW(), &argc); if (!argv) { - MessageBox(NULL, + MessageBox(nullptr, TEXT("An error occured while reading command line arguments."), TEXT("Error!"), MB_ICONERROR | MB_OK); @@ -143,7 +143,7 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, // Ensure that a model file has been specified. if (argc < 2) { - MessageBox(NULL, + MessageBox(nullptr, TEXT("No model file specified. The program will now close."), TEXT("Error!"), MB_ICONERROR | MB_OK); @@ -165,16 +165,16 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; - wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); - wc.hCursor = LoadCursor(NULL, IDC_ARROW); - wc.hbrBackground = NULL; - wc.lpszMenuName = NULL; + wc.hIcon = LoadIcon(nullptr, IDI_APPLICATION); + wc.hCursor = LoadCursor(nullptr, IDC_ARROW); + wc.hbrBackground = nullptr; + wc.lpszMenuName = nullptr; wc.lpszClassName = g_szClassName; - wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); + wc.hIconSm = LoadIcon(nullptr, IDI_APPLICATION); if (!RegisterClassEx(&wc)) { - MessageBox(NULL, "Window Registration Failed!", "Error!", + MessageBox(nullptr, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK); return 0; } @@ -182,35 +182,35 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, RECT wr = { 0,0, SCREEN_WIDTH, SCREEN_HEIGHT }; AdjustWindowRect(&wr, WS_OVERLAPPEDWINDOW, FALSE); - hwnd = CreateWindowEx( + g_hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, g_szClassName, " Simple Textured Directx11 Sample ", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, wr.right - wr.left, wr.bottom - wr.top, - NULL, NULL, hInstance, NULL + nullptr, nullptr, hInstance, nullptr ); - if (hwnd == NULL) + if (g_hwnd == nullptr) { - MessageBox(NULL, "Window Creation Failed!", "Error!", + MessageBox(nullptr, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK); return 0; } - ShowWindow(hwnd, nCmdShow); - UpdateWindow(hwnd); + ShowWindow(g_hwnd, nCmdShow); + UpdateWindow(g_hwnd); width = wr.right - wr.left; height = wr.bottom - wr.top; try { - InitD3D(hInstance, hwnd); + InitD3D(hInstance, g_hwnd); while (true) { - if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) + if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); @@ -225,17 +225,17 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, CleanD3D(); return static_cast(msg.wParam); } catch (const std::exception& e) { - MessageBox(hwnd, e.what(), TEXT("Error!"), MB_ICONERROR | MB_OK); + MessageBox(g_hwnd, e.what(), TEXT("Error!"), MB_ICONERROR | MB_OK); CleanD3D(); return EXIT_FAILURE; } catch (...) { - MessageBox(hwnd, TEXT("Caught an unknown exception."), TEXT("Error!"), MB_ICONERROR | MB_OK); + MessageBox(g_hwnd, TEXT("Caught an unknown exception."), TEXT("Error!"), MB_ICONERROR | MB_OK); CleanD3D(); return EXIT_FAILURE; } } -void InitD3D(HINSTANCE hinstance, HWND hWnd) +void InitD3D(HINSTANCE /*hinstance*/, HWND hWnd) { HRESULT hr; @@ -362,7 +362,7 @@ void InitD3D(HINSTANCE hinstance, HWND hWnd) } // Note this tutorial doesn't handle full-screen swapchains so we block the ALT+ENTER shortcut - dxgiFactory->MakeWindowAssociation(hwnd, DXGI_MWA_NO_ALT_ENTER); + dxgiFactory->MakeWindowAssociation(g_hwnd, DXGI_MWA_NO_ALT_ENTER); dxgiFactory->Release(); @@ -372,7 +372,7 @@ void InitD3D(HINSTANCE hinstance, HWND hWnd) ID3D11Texture2D *pBackBuffer; swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer); - dev->CreateRenderTargetView(pBackBuffer, NULL, &backbuffer); + dev->CreateRenderTargetView(pBackBuffer, nullptr, &backbuffer); pBackBuffer->Release(); D3D11_TEXTURE2D_DESC descDepth; @@ -440,7 +440,7 @@ void InitD3D(HINSTANCE hinstance, HWND hWnd) void CleanD3D(void) { if (swapchain) - swapchain->SetFullscreenState(FALSE, NULL); + swapchain->SetFullscreenState(FALSE, nullptr); if (ourModel) { ourModel->Close(); @@ -513,8 +513,8 @@ void InitPipeline() if(FAILED(CompileShaderFromFile(SHADER_PATH PIXEL_SHADER_FILE, 0, "main", "ps_4_0", &PS))) Throwanerror(UTFConverter(L"Failed to compile shader from file " PIXEL_SHADER_FILE).c_str()); - dev->CreateVertexShader(VS->GetBufferPointer(), VS->GetBufferSize(), NULL, &pVS); - dev->CreatePixelShader(PS->GetBufferPointer(), PS->GetBufferSize(), NULL, &pPS); + dev->CreateVertexShader(VS->GetBufferPointer(), VS->GetBufferSize(), nullptr, &pVS); + dev->CreatePixelShader(PS->GetBufferPointer(), PS->GetBufferSize(), nullptr, &pPS); D3D11_INPUT_ELEMENT_DESC ied[] = { @@ -564,7 +564,7 @@ void InitGraphics() m_View = XMMatrixLookAtLH(Eye, At, Up); ourModel = new ModelLoader; - if (!ourModel->Load(hwnd, dev, devcon, g_ModelPath)) + if (!ourModel->Load(g_hwnd, dev, devcon, g_ModelPath)) Throwanerror("Model couldn't be loaded"); } @@ -576,16 +576,16 @@ HRESULT CompileShaderFromFile(LPCWSTR pFileName, const D3D_SHADER_MACRO* pDefine compileFlags |= D3DCOMPILE_DEBUG; #endif - ID3DBlob* pErrorBlob = NULL; + ID3DBlob* pErrorBlob = nullptr; HRESULT result = D3DCompileFromFile(pFileName, pDefines, D3D_COMPILE_STANDARD_FILE_INCLUDE, pEntryPoint, pShaderModel, compileFlags, 0, ppBytecodeBlob, &pErrorBlob); if (FAILED(result)) { - if (pErrorBlob != NULL) + if (pErrorBlob != nullptr) OutputDebugStringA((LPCSTR)pErrorBlob->GetBufferPointer()); } - if (pErrorBlob != NULL) + if (pErrorBlob != nullptr) pErrorBlob->Release(); return result; diff --git a/samples/SimpleTexturedOpenGL/CMakeLists.txt b/samples/SimpleTexturedOpenGL/CMakeLists.txt index e40c40f29..83cd2746e 100644 --- a/samples/SimpleTexturedOpenGL/CMakeLists.txt +++ b/samples/SimpleTexturedOpenGL/CMakeLists.txt @@ -17,7 +17,6 @@ if ( MSVC ) endif () INCLUDE_DIRECTORIES( - ${Assimp_SOURCE_DIR}/include ${Assimp_SOURCE_DIR}/code ${OPENGL_INCLUDE_DIR} ${GLUT_INCLUDE_DIR} @@ -30,7 +29,6 @@ LINK_DIRECTORIES( ) ADD_EXECUTABLE( assimp_simpletexturedogl WIN32 - SimpleTexturedOpenGL/include/boost_includes.h SimpleTexturedOpenGL/src/model_loading.cpp ${SAMPLES_SHARED_CODE_DIR}/UTFConverter.cpp ${SAMPLES_SHARED_CODE_DIR}/UTFConverter.h @@ -47,3 +45,4 @@ SET_TARGET_PROPERTIES( assimp_simpletexturedogl PROPERTIES INSTALL( TARGETS assimp_simpletexturedogl DESTINATION "${ASSIMP_BIN_INSTALL_DIR}" COMPONENT assimp-dev ) + diff --git a/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/include/boost_includes.h b/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/include/boost_includes.h deleted file mode 100644 index 7b9c0860e..000000000 --- a/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/include/boost_includes.h +++ /dev/null @@ -1 +0,0 @@ -#include \ No newline at end of file diff --git a/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp b/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp index 452c0715c..806da8f8a 100644 --- a/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp +++ b/samples/SimpleTexturedOpenGL/SimpleTexturedOpenGL/src/model_loading.cpp @@ -18,8 +18,10 @@ #include #include +#pragma warning(disable: 4100) // Disable warning 'unreferenced formal parameter' #define STB_IMAGE_IMPLEMENTATION #include "contrib/stb_image/stb_image.h" +#pragma warning(default: 4100) // Enable warning 'unreferenced formal parameter' #include @@ -38,10 +40,10 @@ // The default hard-coded path. Can be overridden by supplying a path through the command line. static std::string modelpath = "../../test/models/OBJ/spider.obj"; -HGLRC hRC=NULL; // Permanent Rendering Context -HDC hDC=NULL; // Private GDI Device Context -HWND hWnd=NULL; // Holds Window Handle -HINSTANCE hInstance; // Holds The Instance Of The Application +HGLRC hRC=nullptr; // Permanent Rendering Context +HDC hDC=nullptr; // Private GDI Device Context +HWND g_hWnd=nullptr; // Holds Window Handle +HINSTANCE g_hInstance=nullptr; // Holds The Instance Of The Application bool keys[256]; // Array used for Keyboard Routine; bool active=TRUE; // Window Active Flag Set To TRUE by Default @@ -64,7 +66,7 @@ GLfloat LightPosition[]= { 0.0f, 0.0f, 15.0f, 1.0f }; // the global Assimp scene object -const aiScene* scene = NULL; +const aiScene* g_scene = nullptr; GLuint scene_list = 0; aiVector3D scene_min, scene_max, scene_center; @@ -122,15 +124,15 @@ bool Import3DFromFile( const std::string& pFile) } else { - MessageBox(NULL, UTFConverter("Couldn't open file: " + pFile).c_wstr() , TEXT("ERROR"), MB_OK | MB_ICONEXCLAMATION); + MessageBox(nullptr, UTFConverter("Couldn't open file: " + pFile).c_wstr() , TEXT("ERROR"), MB_OK | MB_ICONEXCLAMATION); logInfo( importer.GetErrorString()); return false; } - scene = importer.ReadFile( pFile, aiProcessPreset_TargetRealtime_Quality); + g_scene = importer.ReadFile(pFile, aiProcessPreset_TargetRealtime_Quality); // If the import failed, report it - if( !scene) + if(!g_scene) { logInfo( importer.GetErrorString()); return false; @@ -179,7 +181,7 @@ void freeTextureIds() if (textureIds) { delete[] textureIds; - textureIds = NULL; + textureIds = nullptr; } } @@ -215,7 +217,7 @@ int LoadGLTextures(const aiScene* scene) while (texFound == AI_SUCCESS) { texFound = scene->mMaterials[m]->GetTexture(aiTextureType_DIFFUSE, texIndex, &path); - textureIdMap[path.data] = NULL; //fill map with textures, pointers still NULL yet + textureIdMap[path.data] = nullptr; //fill map with textures, pointers still NULL yet texIndex++; } } @@ -283,7 +285,7 @@ int LoadGLTextures(const aiScene* scene) else { /* Error occurred */ - MessageBox(NULL, UTFConverter("Couldn't load Image: " + fileloc).c_wstr(), TEXT("ERROR"), MB_OK | MB_ICONEXCLAMATION); + MessageBox(nullptr, UTFConverter("Couldn't load Image: " + fileloc).c_wstr(), TEXT("ERROR"), MB_OK | MB_ICONEXCLAMATION); } } // Because we have already copied image data into texture data we can release memory used by image. @@ -299,7 +301,7 @@ int LoadGLTextures(const aiScene* scene) // All Setup For OpenGL goes here int InitGL() { - if (!LoadGLTextures(scene)) + if (!LoadGLTextures(g_scene)) { return FALSE; } @@ -440,12 +442,12 @@ void recursive_render (const struct aiScene *sc, const struct aiNode* nd, float // draw all meshes assigned to this node for (; n < nd->mNumMeshes; ++n) { - const struct aiMesh* mesh = scene->mMeshes[nd->mMeshes[n]]; + const struct aiMesh* mesh = sc->mMeshes[nd->mMeshes[n]]; apply_material(sc->mMaterials[mesh->mMaterialIndex]); - if(mesh->mNormals == NULL) + if(mesh->mNormals == nullptr) { glDisable(GL_LIGHTING); } @@ -454,7 +456,7 @@ void recursive_render (const struct aiScene *sc, const struct aiNode* nd, float glEnable(GL_LIGHTING); } - if(mesh->mColors[0] != NULL) + if(mesh->mColors[0] != nullptr) { glEnable(GL_COLOR_MATERIAL); } @@ -480,9 +482,9 @@ void recursive_render (const struct aiScene *sc, const struct aiNode* nd, float for(i = 0; i < face->mNumIndices; i++) // go through all vertices in face { int vertexIndex = face->mIndices[i]; // get group index for current index - if(mesh->mColors[0] != NULL) + if(mesh->mColors[0] != nullptr) Color4f(&mesh->mColors[0][vertexIndex]); - if(mesh->mNormals != NULL) + if(mesh->mNormals != nullptr) if(mesh->HasTextureCoords(0)) //HasTextureCoords(texture_coordinates_set) { @@ -527,7 +529,7 @@ int DrawGLScene() //Here's where we do all the drawing glRotatef(yrot, 0.0f, 1.0f, 0.0f); glRotatef(zrot, 0.0f, 0.0f, 1.0f); - drawAiScene(scene); + drawAiScene(g_scene); //xrot+=0.3f; yrot+=0.2f; @@ -541,50 +543,50 @@ void KillGLWindow() // Properly Kill The Window { if (fullscreen) // Are We In Fullscreen Mode? { - ChangeDisplaySettings(NULL, 0); // If So Switch Back To The Desktop + ChangeDisplaySettings(nullptr, 0); // If So Switch Back To The Desktop ShowCursor(TRUE); // Show Mouse Pointer } if (hRC) // Do We Have A Rendering Context? { - if (!wglMakeCurrent(NULL, NULL)) // Are We Able To Release The DC And RC Contexts? + if (!wglMakeCurrent(nullptr, nullptr)) // Are We Able To Release The DC And RC Contexts? { - MessageBox(NULL, TEXT("Release Of DC And RC Failed."), TEXT("SHUTDOWN ERROR"), MB_OK | MB_ICONINFORMATION); + MessageBox(nullptr, TEXT("Release Of DC And RC Failed."), TEXT("SHUTDOWN ERROR"), MB_OK | MB_ICONINFORMATION); } if (!wglDeleteContext(hRC)) // Are We Able To Delete The RC? { - MessageBox(NULL, TEXT("Release Rendering Context Failed."), TEXT("SHUTDOWN ERROR"), MB_OK | MB_ICONINFORMATION); + MessageBox(nullptr, TEXT("Release Rendering Context Failed."), TEXT("SHUTDOWN ERROR"), MB_OK | MB_ICONINFORMATION); } - hRC = NULL; + hRC = nullptr; } if (hDC) { - if (!ReleaseDC(hWnd, hDC)) // Are We able to Release The DC? - MessageBox(NULL, TEXT("Release Device Context Failed."), TEXT("SHUTDOWN ERROR"), MB_OK | MB_ICONINFORMATION); - hDC = NULL; + if (!ReleaseDC(g_hWnd, hDC)) // Are We able to Release The DC? + MessageBox(nullptr, TEXT("Release Device Context Failed."), TEXT("SHUTDOWN ERROR"), MB_OK | MB_ICONINFORMATION); + hDC = nullptr; } - if (hWnd) + if (g_hWnd) { - if (!DestroyWindow(hWnd)) // Are We Able To Destroy The Window - MessageBox(NULL, TEXT("Could Not Release hWnd."), TEXT("SHUTDOWN ERROR"), MB_OK | MB_ICONINFORMATION); - hWnd = NULL; + if (!DestroyWindow(g_hWnd)) // Are We Able To Destroy The Window + MessageBox(nullptr, TEXT("Could Not Release hWnd."), TEXT("SHUTDOWN ERROR"), MB_OK | MB_ICONINFORMATION); + g_hWnd = nullptr; } - if (hInstance) + if (g_hInstance) { - if (!UnregisterClass(TEXT("OpenGL"), hInstance)) // Are We Able To Unregister Class - MessageBox(NULL, TEXT("Could Not Unregister Class."), TEXT("SHUTDOWN ERROR"), MB_OK | MB_ICONINFORMATION); - hInstance = NULL; + if (!UnregisterClass(TEXT("OpenGL"), g_hInstance)) // Are We Able To Unregister Class + MessageBox(nullptr, TEXT("Could Not Unregister Class."), TEXT("SHUTDOWN ERROR"), MB_OK | MB_ICONINFORMATION); + g_hInstance = nullptr; } } GLboolean abortGLInit(const char* abortMessage) { KillGLWindow(); // Reset Display - MessageBox(NULL, UTFConverter(abortMessage).c_wstr(), TEXT("ERROR"), MB_OK|MB_ICONEXCLAMATION); + MessageBox(nullptr, UTFConverter(abortMessage).c_wstr(), TEXT("ERROR"), MB_OK|MB_ICONEXCLAMATION); return FALSE; // quit and return False } @@ -602,21 +604,21 @@ BOOL CreateGLWindow(const char* title, int width, int height, int bits, bool ful fullscreen = fullscreenflag; - hInstance = GetModuleHandle(NULL); // Grab An Instance For Our Window + g_hInstance = GetModuleHandle(nullptr); // Grab An Instance For Our Window wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Redraw On Move, And Own DC For Window wc.lpfnWndProc = (WNDPROC) WndProc; // WndProc handles Messages wc.cbClsExtra = 0; // No Extra Window Data wc.cbWndExtra = 0; // No Extra Window Data - wc.hInstance = hInstance; - wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); // Load The Default Icon - wc.hCursor = LoadCursor(NULL, IDC_ARROW); // Load the default arrow - wc.hbrBackground= NULL; // No Background required for OpenGL - wc.lpszMenuName = NULL; // No Menu + wc.hInstance = g_hInstance; + wc.hIcon = LoadIcon(nullptr, IDI_WINLOGO); // Load The Default Icon + wc.hCursor = LoadCursor(nullptr, IDC_ARROW); // Load the default arrow + wc.hbrBackground= nullptr; // No Background required for OpenGL + wc.lpszMenuName = nullptr; // No Menu wc.lpszClassName= TEXT("OpenGL"); // Class Name if (!RegisterClass(&wc)) { - MessageBox(NULL, TEXT("Failed to register the window class"), TEXT("ERROR"), MB_OK | MB_ICONEXCLAMATION); + MessageBox(nullptr, TEXT("Failed to register the window class"), TEXT("ERROR"), MB_OK | MB_ICONEXCLAMATION); return FALSE; //exit and return false } @@ -634,14 +636,14 @@ BOOL CreateGLWindow(const char* title, int width, int height, int bits, bool ful if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL) { // If The Mode Fails, Offer Two Options. Quit Or Run In A Window. - if (MessageBox(NULL,TEXT("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?"),TEXT("NeHe GL"),MB_YESNO|MB_ICONEXCLAMATION)==IDYES) + if (MessageBox(nullptr,TEXT("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?"),TEXT("NeHe GL"),MB_YESNO|MB_ICONEXCLAMATION)==IDYES) { fullscreen = FALSE; // Select Windowed Mode (Fullscreen = FALSE) } else { //Popup Messagebox: Closing - MessageBox(NULL, TEXT("Program will close now."), TEXT("ERROR"), MB_OK|MB_ICONSTOP); + MessageBox(nullptr, TEXT("Program will close now."), TEXT("ERROR"), MB_OK|MB_ICONSTOP); return FALSE; //exit, return false } } @@ -661,7 +663,7 @@ BOOL CreateGLWindow(const char* title, int width, int height, int bits, bool ful AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle); // Adjust Window To True Requestes Size - if (!(hWnd=CreateWindowEx( dwExStyle, // Extended Style For The Window + if (nullptr == (g_hWnd=CreateWindowEx(dwExStyle, // Extended Style For The Window TEXT("OpenGL"), // Class Name UTFConverter(title).c_wstr(), // Window Title WS_CLIPSIBLINGS | // Required Window Style @@ -670,10 +672,10 @@ BOOL CreateGLWindow(const char* title, int width, int height, int bits, bool ful 0, 0, // Window Position WindowRect.right-WindowRect.left, // Calc adjusted Window Width WindowRect.bottom-WindowRect.top, // Calc adjustes Window Height - NULL, // No Parent Window - NULL, // No Menu - hInstance, // Instance - NULL ))) // Don't pass anything To WM_CREATE + nullptr, // No Parent Window + nullptr, // No Menu + g_hInstance, // Instance + nullptr ))) // Don't pass anything To WM_CREATE { abortGLInit("Window Creation Error."); return FALSE; @@ -701,13 +703,13 @@ BOOL CreateGLWindow(const char* title, int width, int height, int bits, bool ful 0, 0, 0 // Layer Masks Ignored }; - if (!(hDC=GetDC(hWnd))) // Did we get the Device Context? + if (nullptr == (hDC=GetDC(g_hWnd))) // Did we get the Device Context? { abortGLInit("Can't Create A GL Device Context."); return FALSE; } - if (!(PixelFormat=ChoosePixelFormat(hDC, &pfd))) // Did We Find a matching pixel Format? + if (0 == (PixelFormat=ChoosePixelFormat(hDC, &pfd))) // Did We Find a matching pixel Format? { abortGLInit("Can't Find Suitable PixelFormat"); return FALSE; @@ -719,7 +721,7 @@ BOOL CreateGLWindow(const char* title, int width, int height, int bits, bool ful return FALSE; } - if (!(hRC=wglCreateContext(hDC))) + if (nullptr == (hRC=wglCreateContext(hDC))) { abortGLInit("Can't Create A GL Rendering Context."); return FALSE; @@ -733,9 +735,9 @@ BOOL CreateGLWindow(const char* title, int width, int height, int bits, bool ful //// *** everything okay *** - ShowWindow(hWnd, SW_SHOW); // Show The Window - SetForegroundWindow(hWnd); // Slightly Higher Prio - SetFocus(hWnd); // Sets Keyboard Focus To The Window + ShowWindow(g_hWnd, SW_SHOW); // Show The Window + SetForegroundWindow(g_hWnd); // Slightly Higher Prio + SetFocus(g_hWnd); // Sets Keyboard Focus To The Window ReSizeGLScene(width, height); // Set Up Our Perspective GL Screen if (!InitGL()) @@ -753,7 +755,7 @@ void cleanup() destroyAILogger(); - if (hWnd) + if (g_hWnd) KillGLWindow(); }; @@ -818,12 +820,12 @@ LRESULT CALLBACK WndProc(HWND hWnd, // Handles for this Window return DefWindowProc(hWnd, uMsg, wParam, lParam); } -int WINAPI WinMain( HINSTANCE hInstance, // The instance - HINSTANCE hPrevInstance, // Previous instance - LPSTR lpCmdLine, // Command Line Parameters - int nShowCmd ) // Window Show State +int WINAPI WinMain( HINSTANCE /*hInstance*/, // The instance + HINSTANCE /*hPrevInstance*/, // Previous instance + LPSTR /*lpCmdLine*/, // Command Line Parameters + int /*nShowCmd*/ ) // Window Show State { - MSG msg; + MSG msg = {}; BOOL done=FALSE; createAILogger(); @@ -832,7 +834,7 @@ int WINAPI WinMain( HINSTANCE hInstance, // The instance // Check the command line for an override file path. int argc; LPWSTR* argv = CommandLineToArgvW(GetCommandLineW(), &argc); - if (argv != NULL && argc > 1) + if (argv != nullptr && argc > 1) { std::wstring modelpathW(argv[1]); modelpath = UTFConverter(modelpathW).str(); @@ -846,7 +848,7 @@ int WINAPI WinMain( HINSTANCE hInstance, // The instance logInfo("=============== Post Import ===================="); - if (MessageBox(NULL, TEXT("Would You Like To Run In Fullscreen Mode?"), TEXT("Start Fullscreen?"), MB_YESNO|MB_ICONEXCLAMATION)==IDNO) + if (MessageBox(nullptr, TEXT("Would You Like To Run In Fullscreen Mode?"), TEXT("Start Fullscreen?"), MB_YESNO|MB_ICONEXCLAMATION)==IDNO) { fullscreen=FALSE; } @@ -859,7 +861,7 @@ int WINAPI WinMain( HINSTANCE hInstance, // The instance while(!done) // Game Loop { - if (PeekMessage(&msg, NULL, 0,0, PM_REMOVE)) + if (PeekMessage(&msg, nullptr, 0,0, PM_REMOVE)) { if (msg.message==WM_QUIT) { diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index c5c414639..bf6694845 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -61,6 +61,14 @@ SET( COMMON unit/utIssues.cpp unit/utAnim.cpp unit/AssimpAPITest.cpp + unit/AssimpAPITest_aiMatrix3x3.cpp + unit/AssimpAPITest_aiMatrix4x4.cpp + unit/AssimpAPITest_aiQuaternion.cpp + unit/AssimpAPITest_aiVector2D.cpp + unit/AssimpAPITest_aiVector3D.cpp + unit/MathTest.cpp + unit/MathTest.h + unit/RandomNumberGeneration.h unit/utBatchLoader.cpp unit/utDefaultIOStream.cpp unit/utFastAtof.cpp @@ -76,10 +84,13 @@ SET( COMMON unit/utProfiler.cpp unit/utSharedPPData.cpp unit/utStringUtils.cpp + unit/Common/uiScene.cpp unit/Common/utLineSplitter.cpp + unit/Common/utSpatialSort.cpp ) SET( IMPORTERS + unit/ImportExport/Assxml/utAssxmlImportExport.cpp unit/utLWSImportExport.cpp unit/utLWOImportExport.cpp unit/utSMDImportExport.cpp @@ -136,6 +147,9 @@ SET( IMPORTERS unit/ImportExport/MDL/utMDLImporter_HL1_ImportSettings.cpp unit/ImportExport/MDL/utMDLImporter_HL1_Materials.cpp unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp + #unit/ImportExport/IRR/utIrrImportExport.cpp + unit/ImportExport/RAW/utRAWImportExport.cpp + unit/ImportExport/Terragen/utTerragenImportExport.cpp ) SET( MATERIAL diff --git a/test/models/TER/RealisticTerrain.ter b/test/models/TER/RealisticTerrain.ter index bd208473a..605d0ee17 100644 Binary files a/test/models/TER/RealisticTerrain.ter and b/test/models/TER/RealisticTerrain.ter differ diff --git a/test/models/glTF2/RecursiveNodes/RecursiveNodes.gltf b/test/models/glTF2/RecursiveNodes/RecursiveNodes.gltf new file mode 100644 index 000000000..11cf04166 --- /dev/null +++ b/test/models/glTF2/RecursiveNodes/RecursiveNodes.gltf @@ -0,0 +1,25 @@ +{ + "asset": { + "version": "2.0" + }, + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "nodes": [ + { + "children": [ + 1 + ] + }, + { + "children": [ + 0 + ] + } + ] +} diff --git a/test/unit/AssimpAPITest_aiMatrix3x3.cpp b/test/unit/AssimpAPITest_aiMatrix3x3.cpp new file mode 100644 index 000000000..5c0282a63 --- /dev/null +++ b/test/unit/AssimpAPITest_aiMatrix3x3.cpp @@ -0,0 +1,151 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2020, assimp team + + + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above +copyright notice, this list of conditions and the +following disclaimer. + +* Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the +following disclaimer in the documentation and/or other +materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its +contributors may be used to endorse or promote products +derived from this software without specific prior +written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ +#include "UnitTestPCH.h" +#include "MathTest.h" + +using namespace Assimp; + +class AssimpAPITest_aiMatrix3x3 : public AssimpMathTest { +protected: + virtual void SetUp() { + result_c = result_cpp = aiMatrix3x3(); + } + + aiMatrix3x3 result_c, result_cpp; +}; + +TEST_F(AssimpAPITest_aiMatrix3x3, aiIdentityMatrix3Test) { + // Force a non-identity matrix. + result_c = aiMatrix3x3(0,0,0,0,0,0,0,0,0); + aiIdentityMatrix3(&result_c); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiMatrix3x3, aiMatrix3FromMatrix4Test) { + const auto m = random_mat4(); + result_cpp = aiMatrix3x3(m); + aiMatrix3FromMatrix4(&result_c, &m); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiMatrix3x3, aiMatrix3FromQuaternionTest) { + const auto q = random_quat(); + result_cpp = q.GetMatrix(); + aiMatrix3FromQuaternion(&result_c, &q); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiMatrix3x3, aiMatrix3AreEqualTest) { + result_c = result_cpp = random_mat3(); + EXPECT_EQ(result_cpp == result_c, + (bool)aiMatrix3AreEqual(&result_cpp, &result_c)); +} + +TEST_F(AssimpAPITest_aiMatrix3x3, aiMatrix3AreEqualEpsilonTest) { + result_c = result_cpp = random_mat3(); + EXPECT_EQ(result_cpp.Equal(result_c, Epsilon), + (bool)aiMatrix3AreEqualEpsilon(&result_cpp, &result_c, Epsilon)); +} + +TEST_F(AssimpAPITest_aiMatrix3x3, aiMultiplyMatrix3Test) { + const auto m = random_mat3(); + result_c = result_cpp = random_mat3(); + result_cpp *= m; + aiMultiplyMatrix3(&result_c, &m); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiMatrix3x3, aiTransposeMatrix3Test) { + result_c = result_cpp = random_mat3(); + result_cpp.Transpose(); + aiTransposeMatrix3(&result_c); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiMatrix3x3, aiMatrix3InverseTest) { + // Use a predetermined matrix to prevent arbitrary + // cases where it could have a null determinant. + result_c = result_cpp = aiMatrix3x3( + 5, 2, 7, + 4, 6, 9, + 1, 8, 3); + result_cpp.Inverse(); + aiMatrix3Inverse(&result_c); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiMatrix3x3, aiMatrix3DeterminantTest) { + result_c = result_cpp = random_mat3(); + EXPECT_EQ(result_cpp.Determinant(), + aiMatrix3Determinant(&result_c)); +} + +TEST_F(AssimpAPITest_aiMatrix3x3, aiMatrix3RotationZTest) { + const float angle(RandPI.next()); + aiMatrix3x3::RotationZ(angle, result_cpp); + aiMatrix3RotationZ(&result_c, angle); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiMatrix3x3, aiMatrix3FromRotationAroundAxisTest) { + const float angle(RandPI.next()); + const auto axis = random_unit_vec3(); + aiMatrix3x3::Rotation(angle, axis, result_cpp); + aiMatrix3FromRotationAroundAxis(&result_c, &axis, angle); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiMatrix3x3, aiMatrix3TranslationTest) { + const auto axis = random_vec2(); + aiMatrix3x3::Translation(axis, result_cpp); + aiMatrix3Translation(&result_c, &axis); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiMatrix3x3, aiMatrix3FromToTest) { + // Use predetermined vectors to prevent running into division by zero. + const auto from = aiVector3D(1,2,1).Normalize(), to = aiVector3D(-1,1,1).Normalize(); + aiMatrix3x3::FromToMatrix(from, to, result_cpp); + aiMatrix3FromTo(&result_c, &from, &to); + EXPECT_EQ(result_cpp, result_c); +} diff --git a/test/unit/AssimpAPITest_aiMatrix4x4.cpp b/test/unit/AssimpAPITest_aiMatrix4x4.cpp new file mode 100644 index 000000000..2c89726e0 --- /dev/null +++ b/test/unit/AssimpAPITest_aiMatrix4x4.cpp @@ -0,0 +1,259 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2020, assimp team + + + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above +copyright notice, this list of conditions and the +following disclaimer. + +* Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the +following disclaimer in the documentation and/or other +materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its +contributors may be used to endorse or promote products +derived from this software without specific prior +written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ +#include "UnitTestPCH.h" +#include "MathTest.h" + +using namespace Assimp; + +class AssimpAPITest_aiMatrix4x4 : public AssimpMathTest { +protected: + virtual void SetUp() { + result_c = result_cpp = aiMatrix4x4(); + } + + /* Generates a predetermined transformation matrix to use + for the aiDecompose functions to prevent running into + division by zero. */ + aiMatrix4x4 get_predetermined_transformation_matrix_for_decomposition() const { + aiMatrix4x4 t, r; + aiMatrix4x4::Translation(aiVector3D(14,-25,-8), t); + aiMatrix4x4::Rotation(Math::PI() / 4.0f, aiVector3D(1).Normalize(), r); + return t * r; + } + + aiMatrix4x4 result_c, result_cpp; +}; + +TEST_F(AssimpAPITest_aiMatrix4x4, aiIdentityMatrix4Test) { + // Force a non-identity matrix. + result_c = aiMatrix4x4(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); + aiIdentityMatrix4(&result_c); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4FromMatrix3Test) { + aiMatrix3x3 m = random_mat3(); + result_cpp = aiMatrix4x4(m); + aiMatrix4FromMatrix3(&result_c, &m); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4FromScalingQuaternionPositionTest) { + const aiVector3D s = random_vec3(); + const aiQuaternion q = random_quat(); + const aiVector3D t = random_vec3(); + result_cpp = aiMatrix4x4(s, q, t); + aiMatrix4FromScalingQuaternionPosition(&result_c, &s, &q, &t); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4AddTest) { + const aiMatrix4x4 temp = random_mat4(); + result_c = result_cpp = random_mat4(); + result_cpp = result_cpp + temp; + aiMatrix4Add(&result_c, &temp); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4AreEqualTest) { + result_c = result_cpp = random_mat4(); + EXPECT_EQ(result_cpp == result_c, + (bool)aiMatrix4AreEqual(&result_cpp, &result_c)); +} + +TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4AreEqualEpsilonTest) { + result_c = result_cpp = random_mat4(); + EXPECT_EQ(result_cpp.Equal(result_c, Epsilon), + (bool)aiMatrix4AreEqualEpsilon(&result_cpp, &result_c, Epsilon)); +} + +TEST_F(AssimpAPITest_aiMatrix4x4, aiMultiplyMatrix4Test) { + const auto m = random_mat4(); + result_c = result_cpp = random_mat4(); + result_cpp *= m; + aiMultiplyMatrix4(&result_c, &m); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiMatrix4x4, aiTransposeMatrix4Test) { + result_c = result_cpp = random_mat4(); + result_cpp.Transpose(); + aiTransposeMatrix4(&result_c); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4InverseTest) { + // Use a predetermined matrix to prevent arbitrary + // cases where it could have a null determinant. + result_c = result_cpp = aiMatrix4x4( + 6, 10, 15, 3, + 14, 2, 12, 8, + 9, 13, 5, 16, + 4, 7, 11, 1); + result_cpp.Inverse(); + aiMatrix4Inverse(&result_c); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4DeterminantTest) { + result_c = result_cpp = random_mat4(); + EXPECT_EQ(result_cpp.Determinant(), + aiMatrix4Determinant(&result_c)); +} + +TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4IsIdentityTest) { + EXPECT_EQ(result_cpp.IsIdentity(), + (bool)aiMatrix4IsIdentity(&result_c)); +} + +TEST_F(AssimpAPITest_aiMatrix4x4, aiDecomposeMatrixTest) { + aiVector3D scaling_c, scaling_cpp, + position_c, position_cpp; + aiQuaternion rotation_c, rotation_cpp; + + result_c = result_cpp = get_predetermined_transformation_matrix_for_decomposition(); + result_cpp.Decompose(scaling_cpp, rotation_cpp, position_cpp); + aiDecomposeMatrix(&result_c, &scaling_c, &rotation_c, &position_c); + EXPECT_EQ(scaling_cpp, scaling_c); + EXPECT_EQ(position_cpp, position_c); + EXPECT_EQ(rotation_cpp, rotation_c); +} + +TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4DecomposeIntoScalingEulerAnglesPositionTest) { + aiVector3D scaling_c, scaling_cpp, + rotation_c, rotation_cpp, + position_c, position_cpp; + + result_c = result_cpp = get_predetermined_transformation_matrix_for_decomposition(); + result_cpp.Decompose(scaling_cpp, rotation_cpp, position_cpp); + aiMatrix4DecomposeIntoScalingEulerAnglesPosition(&result_c, &scaling_c, &rotation_c, &position_c); + EXPECT_EQ(scaling_cpp, scaling_c); + EXPECT_EQ(position_cpp, position_c); + EXPECT_EQ(rotation_cpp, rotation_c); +} + +TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4DecomposeIntoScalingAxisAnglePositionTest) { + aiVector3D scaling_c, scaling_cpp, + axis_c, axis_cpp, + position_c, position_cpp; + float angle_c, angle_cpp; + + result_c = result_cpp = get_predetermined_transformation_matrix_for_decomposition(); + result_cpp.Decompose(scaling_cpp, axis_cpp, angle_cpp, position_cpp); + aiMatrix4DecomposeIntoScalingAxisAnglePosition(&result_c, &scaling_c, &axis_c, &angle_c, &position_c); + EXPECT_EQ(scaling_cpp, scaling_c); + EXPECT_EQ(axis_cpp, axis_c); + EXPECT_EQ(angle_cpp, angle_c); + EXPECT_EQ(position_cpp, position_c); +} + +TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4DecomposeNoScalingTest) { + aiVector3D position_c, position_cpp; + aiQuaternion rotation_c, rotation_cpp; + + result_c = result_cpp = get_predetermined_transformation_matrix_for_decomposition(); + result_cpp.DecomposeNoScaling(rotation_cpp, position_cpp); + aiMatrix4DecomposeNoScaling(&result_c, &rotation_c, &position_c); + EXPECT_EQ(position_cpp, position_c); + EXPECT_EQ(rotation_cpp, rotation_c); +} + +TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4FromEulerAnglesTest) { + const float x(RandPI.next()), + y(RandPI.next()), + z(RandPI.next()); + result_cpp.FromEulerAnglesXYZ(x, y, z); + aiMatrix4FromEulerAngles(&result_c, x, y, z); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4RotationXTest) { + const float angle(RandPI.next()); + aiMatrix4x4::RotationX(angle, result_cpp); + aiMatrix4RotationX(&result_c, angle); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4RotationYTest) { + const float angle(RandPI.next()); + aiMatrix4x4::RotationY(angle, result_cpp); + aiMatrix4RotationY(&result_c, angle); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4RotationZTest) { + const float angle(RandPI.next()); + aiMatrix4x4::RotationZ(angle, result_cpp); + aiMatrix4RotationZ(&result_c, angle); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4FromRotationAroundAxisTest) { + const float angle(RandPI.next()); + const auto axis = random_unit_vec3(); + aiMatrix4x4::Rotation(angle, axis, result_cpp); + aiMatrix4FromRotationAroundAxis(&result_c, &axis, angle); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4TranslationTest) { + const auto axis = random_vec3(); + aiMatrix4x4::Translation(axis, result_cpp); + aiMatrix4Translation(&result_c, &axis); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4ScalingTest) { + const auto scaling = random_vec3(); + aiMatrix4x4::Scaling(scaling, result_cpp); + aiMatrix4Scaling(&result_c, &scaling); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4FromToTest) { + // Use predetermined vectors to prevent running into division by zero. + const auto from = aiVector3D(1,2,1).Normalize(), to = aiVector3D(-1,1,1).Normalize(); + aiMatrix4x4::FromToMatrix(from, to, result_cpp); + aiMatrix4FromTo(&result_c, &from, &to); + EXPECT_EQ(result_cpp, result_c); +} diff --git a/test/unit/AssimpAPITest_aiQuaternion.cpp b/test/unit/AssimpAPITest_aiQuaternion.cpp new file mode 100644 index 000000000..6bdef5a15 --- /dev/null +++ b/test/unit/AssimpAPITest_aiQuaternion.cpp @@ -0,0 +1,135 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2020, assimp team + + + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above +copyright notice, this list of conditions and the +following disclaimer. + +* Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the +following disclaimer in the documentation and/or other +materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its +contributors may be used to endorse or promote products +derived from this software without specific prior +written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ +#include "UnitTestPCH.h" +#include "MathTest.h" + +using namespace Assimp; + +class AssimpAPITest_aiQuaternion : public AssimpMathTest { +protected: + virtual void SetUp() { + result_c = result_cpp = aiQuaternion(); + } + + aiQuaternion result_c, result_cpp; +}; + +TEST_F(AssimpAPITest_aiQuaternion, aiCreateQuaternionFromMatrixTest) { + // Use a predetermined transformation matrix + // to prevent running into division by zero. + aiMatrix3x3 m, r; + aiMatrix3x3::Translation(aiVector2D(14,-25), m); + aiMatrix3x3::RotationZ(Math::PI() / 4.0f, r); + m = m * r; + + result_cpp = aiQuaternion(m); + aiCreateQuaternionFromMatrix(&result_c, &m); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiQuaternion, aiQuaternionFromEulerAnglesTest) { + const float x(RandPI.next()), + y(RandPI.next()), + z(RandPI.next()); + result_cpp = aiQuaternion(x, y, z); + aiQuaternionFromEulerAngles(&result_c, x, y, z); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiQuaternion, aiQuaternionFromAxisAngleTest) { + const float angle(RandPI.next()); + const aiVector3D axis(random_unit_vec3()); + result_cpp = aiQuaternion(axis, angle); + aiQuaternionFromAxisAngle(&result_c, &axis, angle); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiQuaternion, aiQuaternionFromNormalizedQuaternionTest) { + const auto qvec3 = random_unit_vec3(); + result_cpp = aiQuaternion(qvec3); + aiQuaternionFromNormalizedQuaternion(&result_c, &qvec3); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiQuaternion, aiQuaternionAreEqualTest) { + result_c = result_cpp = random_quat(); + EXPECT_EQ(result_cpp == result_c, + (bool)aiQuaternionAreEqual(&result_cpp, &result_c)); +} + +TEST_F(AssimpAPITest_aiQuaternion, aiQuaternionAreEqualEpsilonTest) { + result_c = result_cpp = random_quat(); + EXPECT_EQ(result_cpp.Equal(result_c, Epsilon), + (bool)aiQuaternionAreEqualEpsilon(&result_cpp, &result_c, Epsilon)); +} + +TEST_F(AssimpAPITest_aiQuaternion, aiQuaternionNormalizeTest) { + result_c = result_cpp = random_quat(); + aiQuaternionNormalize(&result_c); + EXPECT_EQ(result_cpp.Normalize(), result_c); +} + +TEST_F(AssimpAPITest_aiQuaternion, aiQuaternionConjugateTest) { + result_c = result_cpp = random_quat(); + aiQuaternionConjugate(&result_c); + EXPECT_EQ(result_cpp.Conjugate(), result_c); +} + +TEST_F(AssimpAPITest_aiQuaternion, aiQuaternionMultiplyTest) { + const aiQuaternion temp = random_quat(); + result_c = result_cpp = random_quat(); + result_cpp = result_cpp * temp; + aiQuaternionMultiply(&result_c, &temp); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiQuaternion, aiQuaternionInterpolateTest) { + // Use predetermined quaternions to prevent division by zero + // during slerp calculations. + const float INTERPOLATION(0.5f); + const auto q1 = aiQuaternion(aiVector3D(-1,1,1).Normalize(), Math::PI() / 4.0f); + const auto q2 = aiQuaternion(aiVector3D(1,2,1).Normalize(), Math::PI() / 2.0f); + aiQuaternion::Interpolate(result_cpp, q1, q2, INTERPOLATION); + aiQuaternionInterpolate(&result_c, &q1, &q2, INTERPOLATION); + EXPECT_EQ(result_cpp, result_c); +} diff --git a/test/unit/AssimpAPITest_aiVector2D.cpp b/test/unit/AssimpAPITest_aiVector2D.cpp new file mode 100644 index 000000000..55df06025 --- /dev/null +++ b/test/unit/AssimpAPITest_aiVector2D.cpp @@ -0,0 +1,140 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2020, assimp team + + + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above +copyright notice, this list of conditions and the +following disclaimer. + +* Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the +following disclaimer in the documentation and/or other +materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its +contributors may be used to endorse or promote products +derived from this software without specific prior +written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ +#include "UnitTestPCH.h" +#include "MathTest.h" + +using namespace Assimp; + +class AssimpAPITest_aiVector2D : public AssimpMathTest { +protected: + virtual void SetUp() { + result_c = result_cpp = aiVector2D(); + temp = random_vec2(); // Generates a random 2D vector != null vector. + } + + aiVector2D result_c, result_cpp, temp; +}; + +TEST_F(AssimpAPITest_aiVector2D, aiVector2AreEqualTest) { + result_c = result_cpp = random_vec2(); + EXPECT_EQ(result_cpp == result_c, + (bool)aiVector2AreEqual(&result_cpp, &result_c)); +} + +TEST_F(AssimpAPITest_aiVector2D, aiVector2AreEqualEpsilonTest) { + result_c = result_cpp = random_vec2(); + EXPECT_EQ(result_cpp.Equal(result_c, Epsilon), + (bool)aiVector2AreEqualEpsilon(&result_cpp, &result_c, Epsilon)); +} + +TEST_F(AssimpAPITest_aiVector2D, aiVector2AddTest) { + result_c = result_cpp = random_vec2(); + result_cpp += temp; + aiVector2Add(&result_c, &temp); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiVector2D, aiVector2SubtractTest) { + result_c = result_cpp = random_vec2(); + result_cpp -= temp; + aiVector2Subtract(&result_c, &temp); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiVector2D, aiVector2ScaleTest) { + const float FACTOR = RandNonZero.next(); + result_c = result_cpp = random_vec2(); + result_cpp *= FACTOR; + aiVector2Scale(&result_c, FACTOR); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiVector2D, aiVector2SymMulTest) { + result_c = result_cpp = random_vec2(); + result_cpp = result_cpp.SymMul(temp); + aiVector2SymMul(&result_c, &temp); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiVector2D, aiVector2DivideByScalarTest) { + const float DIVISOR = RandNonZero.next(); + result_c = result_cpp = random_vec2(); + result_cpp /= DIVISOR; + aiVector2DivideByScalar(&result_c, DIVISOR); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiVector2D, aiVector2DivideByVectorTest) { + result_c = result_cpp = random_vec2(); + result_cpp = result_cpp / temp; + aiVector2DivideByVector(&result_c, &temp); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiVector2D, aiVector2LengthTest) { + result_c = result_cpp = random_vec2(); + EXPECT_EQ(result_cpp.Length(), aiVector2Length(&result_c)); +} + +TEST_F(AssimpAPITest_aiVector2D, aiVector2SquareLengthTest) { + result_c = result_cpp = random_vec2(); + EXPECT_EQ(result_cpp.SquareLength(), aiVector2SquareLength(&result_c)); +} + +TEST_F(AssimpAPITest_aiVector2D, aiVector2NegateTest) { + result_c = result_cpp = random_vec2(); + aiVector2Negate(&result_c); + EXPECT_EQ(-result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiVector2D, aiVector2DotProductTest) { + result_c = result_cpp = random_vec2(); + EXPECT_EQ(result_cpp * result_c, + aiVector2DotProduct(&result_cpp, &result_c)); +} + +TEST_F(AssimpAPITest_aiVector2D, aiVector2NormalizeTest) { + result_c = result_cpp = random_vec2(); + aiVector2Normalize(&result_c); + EXPECT_EQ(result_cpp.Normalize(), result_c); +} diff --git a/test/unit/AssimpAPITest_aiVector3D.cpp b/test/unit/AssimpAPITest_aiVector3D.cpp new file mode 100644 index 000000000..a59867f10 --- /dev/null +++ b/test/unit/AssimpAPITest_aiVector3D.cpp @@ -0,0 +1,185 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2020, assimp team + + + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above +copyright notice, this list of conditions and the +following disclaimer. + +* Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the +following disclaimer in the documentation and/or other +materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its +contributors may be used to endorse or promote products +derived from this software without specific prior +written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ +#include "UnitTestPCH.h" +#include "MathTest.h" + +using namespace Assimp; + +class AssimpAPITest_aiVector3D : public AssimpMathTest { +protected: + virtual void SetUp() { + result_c = result_cpp = aiVector3D(); + temp = random_vec3(); // Generates a random 3D vector != null vector. + } + + aiVector3D result_c, result_cpp, temp; +}; + +TEST_F(AssimpAPITest_aiVector3D, aiVector3AreEqualTest) { + result_c = result_cpp = random_vec3(); + EXPECT_EQ(result_cpp == result_c, + (bool)aiVector3AreEqual(&result_cpp, &result_c)); +} + +TEST_F(AssimpAPITest_aiVector3D, aiVector3AreEqualEpsilonTest) { + result_c = result_cpp = random_vec3(); + EXPECT_EQ(result_cpp.Equal(result_c, Epsilon), + (bool)aiVector3AreEqualEpsilon(&result_cpp, &result_c, Epsilon)); +} + +TEST_F(AssimpAPITest_aiVector3D, aiVector3LessThanTest) { + result_c = result_cpp = random_vec3(); + EXPECT_EQ(result_cpp < temp, + (bool)aiVector3LessThan(&result_c, &temp)); +} + +TEST_F(AssimpAPITest_aiVector3D, aiVector3AddTest) { + result_c = result_cpp = random_vec3(); + result_cpp += temp; + aiVector3Add(&result_c, &temp); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiVector3D, aiVector3SubtractTest) { + result_c = result_cpp = random_vec3(); + result_cpp -= temp; + aiVector3Subtract(&result_c, &temp); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiVector3D, aiVector3ScaleTest) { + const float FACTOR = RandNonZero.next(); + result_c = result_cpp = random_vec3(); + result_cpp *= FACTOR; + aiVector3Scale(&result_c, FACTOR); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiVector3D, aiVector3SymMulTest) { + result_c = result_cpp = random_vec3(); + result_cpp = result_cpp.SymMul(temp); + aiVector3SymMul(&result_c, &temp); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiVector3D, aiVector3DivideByScalarTest) { + const float DIVISOR = RandNonZero.next(); + result_c = result_cpp = random_vec3(); + result_cpp /= DIVISOR; + aiVector3DivideByScalar(&result_c, DIVISOR); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiVector3D, aiVector3DivideByVectorTest) { + result_c = result_cpp = random_vec3(); + result_cpp = result_cpp / temp; + aiVector3DivideByVector(&result_c, &temp); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiVector3D, aiVector3LengthTest) { + result_c = result_cpp = random_vec3(); + EXPECT_EQ(result_cpp.Length(), aiVector3Length(&result_c)); +} + +TEST_F(AssimpAPITest_aiVector3D, aiVector3SquareLengthTest) { + result_c = result_cpp = random_vec3(); + EXPECT_EQ(result_cpp.SquareLength(), aiVector3SquareLength(&result_c)); +} + +TEST_F(AssimpAPITest_aiVector3D, aiVector3NegateTest) { + result_c = result_cpp = random_vec3(); + aiVector3Negate(&result_c); + EXPECT_EQ(-result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiVector3D, aiVector3DotProductTest) { + result_c = result_cpp = random_vec3(); + EXPECT_EQ(result_cpp * result_c, + aiVector3DotProduct(&result_cpp, &result_c)); +} + +TEST_F(AssimpAPITest_aiVector3D, aiVector3CrossProductTest) { + result_c = result_cpp = random_vec3(); + result_cpp = result_cpp ^ temp; + aiVector3CrossProduct(&result_c, &result_c, &temp); + EXPECT_EQ(result_cpp, result_c); +} + +TEST_F(AssimpAPITest_aiVector3D, aiVector3NormalizeTest) { + result_c = result_cpp = random_vec3(); + aiVector3Normalize(&result_c); + EXPECT_EQ(result_cpp.Normalize(), result_c); +} + +TEST_F(AssimpAPITest_aiVector3D, aiVector3NormalizeSafeTest) { + result_c = result_cpp = random_vec3(); + aiVector3NormalizeSafe(&result_c); + EXPECT_EQ(result_cpp.NormalizeSafe(), result_c); +} + +TEST_F(AssimpAPITest_aiVector3D, aiVector3RotateByQuaternionTest) { + aiVector3D v_c, v_cpp; + v_c = v_cpp = random_vec3(); + const auto q = random_quat(); + aiVector3RotateByQuaternion(&v_c, &q); + EXPECT_EQ(q.Rotate(v_cpp), v_c); +} + +TEST_F(AssimpAPITest_aiVector3D, aiTransformVecByMatrix3Test) { + const auto m = random_mat3(); + aiVector3D v_c, v_cpp; + v_c = v_cpp = random_vec3(); + v_cpp *= m; + aiTransformVecByMatrix3(&v_c, &m); + EXPECT_EQ(v_cpp, v_c); +} + +TEST_F(AssimpAPITest_aiVector3D, aiTransformVecByMatrix4Test) { + const auto m = random_mat4(); + aiVector3D v_c, v_cpp; + v_c = v_cpp = random_vec3(); + v_cpp *= m; + aiTransformVecByMatrix4(&v_c, &m); + EXPECT_EQ(v_cpp, v_c); +} diff --git a/test/unit/Common/uiScene.cpp b/test/unit/Common/uiScene.cpp new file mode 100644 index 000000000..d5b123b48 --- /dev/null +++ b/test/unit/Common/uiScene.cpp @@ -0,0 +1,93 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2020, assimp team + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above +copyright notice, this list of conditions and the +following disclaimer. + +* Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the +following disclaimer in the documentation and/or other +materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its +contributors may be used to endorse or promote products +derived from this software without specific prior +written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ + +#include "UnitTestPCH.h" + +#include + + +using namespace Assimp; + +class utScene : public ::testing::Test { +protected: + aiScene *scene; + + void SetUp() override { + scene = new aiScene; + } + + void TearDown() override { + delete scene; + scene = nullptr; + } +}; + +TEST_F(utScene, findNodeTest) { + scene->mRootNode = new aiNode(); + scene->mRootNode->mName.Set("test"); + aiNode *child = new aiNode; + child->mName.Set("child"); + scene->mRootNode->addChildren(1, &child); + aiNode *found = scene->mRootNode->FindNode("child"); + EXPECT_EQ(child, found); +} + +TEST_F(utScene, sceneHasContentTest) { + EXPECT_FALSE(scene->HasAnimations()); + EXPECT_FALSE(scene->HasMaterials()); + EXPECT_FALSE(scene->HasMeshes()); + EXPECT_FALSE(scene->HasCameras()); + EXPECT_FALSE(scene->HasLights()); + EXPECT_FALSE(scene->HasTextures()); +} + +TEST_F(utScene, getShortFilenameTest) { + std::string long_filename1 = "foo_bar/name"; + const char *name1 = scene->GetShortFilename(long_filename1.c_str()); + EXPECT_NE(nullptr, name1); + + std::string long_filename2 = "foo_bar\\name"; + const char *name2 = scene->GetShortFilename(long_filename2.c_str()); + EXPECT_NE(nullptr, name2); +} + +TEST_F(utScene, getEmbeddedTextureTest) { +} diff --git a/test/unit/Common/utSpatialSort.cpp b/test/unit/Common/utSpatialSort.cpp new file mode 100644 index 000000000..0783cf5e2 --- /dev/null +++ b/test/unit/Common/utSpatialSort.cpp @@ -0,0 +1,84 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2020, assimp team + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above +copyright notice, this list of conditions and the +following disclaimer. + +* Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the +following disclaimer in the documentation and/or other +materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its +contributors may be used to endorse or promote products +derived from this software without specific prior +written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ +#include "UnitTestPCH.h" + +#include + +using namespace Assimp; + +class utSpatialSort : public ::testing::Test { +public + : + aiVector3D *vecs; + +protected: + void SetUp() override { + ::srand(static_cast(time(0))); + vecs = new aiVector3D[100]; + for (size_t i = 0; i < 100; ++i) { + vecs[i].x = static_cast(rand()) / (static_cast(RAND_MAX / 100)); + vecs[i].y = static_cast(rand()) / (static_cast(RAND_MAX / 100)); + vecs[i].z = static_cast(rand()) / (static_cast(RAND_MAX / 100)); + } + } + + void TearDown() override { + delete[] vecs; + } +}; + +TEST_F( utSpatialSort, findIdenticalsTest ) { + SpatialSort sSort; + sSort.Fill(vecs, 100, sizeof(aiVector3D)); + + std::vector indices; + sSort.FindIdenticalPositions(vecs[0], indices); + EXPECT_EQ(1u, indices.size()); +} + +TEST_F(utSpatialSort, findPositionsTest) { + SpatialSort sSort; + sSort.Fill(vecs, 100, sizeof(aiVector3D)); + + std::vector indices; + sSort.FindPositions(vecs[0], 0.01f, indices); + EXPECT_EQ(1u, indices.size()); +} diff --git a/test/unit/ImportExport/Assxml/utAssxmlImportExport.cpp b/test/unit/ImportExport/Assxml/utAssxmlImportExport.cpp new file mode 100644 index 000000000..c10d91b41 --- /dev/null +++ b/test/unit/ImportExport/Assxml/utAssxmlImportExport.cpp @@ -0,0 +1,76 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2019, 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 "AbstractImportExportBase.h" +#include "SceneDiffer.h" +#include "UnitTestPCH.h" + +#include +#include +#include + +using namespace Assimp; + +class utAssxmlImportExport : public AbstractImportExportBase { +public: + bool importerTest() override { + return true; + } + +#ifndef ASSIMP_BUILD_NO_EXPORT + bool exporterTest() override { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/OBJ/spider.obj", aiProcess_ValidateDataStructure); + EXPECT_NE(scene, nullptr ); + + ::Assimp::Exporter exporter; + return AI_SUCCESS == exporter.Export(scene, "assxml", ASSIMP_TEST_MODELS_DIR "/OBJ/spider_out.assxml"); + } +#endif +}; + +#ifndef ASSIMP_BUILD_NO_EXPORT + +TEST_F(utAssxmlImportExport, exportAssxmlTest) { + EXPECT_TRUE(exporterTest()); +} + +#endif diff --git a/test/unit/ImportExport/IRR/utIrrImportExport.cpp b/test/unit/ImportExport/IRR/utIrrImportExport.cpp new file mode 100644 index 000000000..eaa4c8f4c --- /dev/null +++ b/test/unit/ImportExport/IRR/utIrrImportExport.cpp @@ -0,0 +1,66 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2020, 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 "AbstractImportExportBase.h" +#include "UnitTestPCH.h" +#include +#include +#include + +using namespace Assimp; + +class utIrrImportExport : public AbstractImportExportBase { +public: + virtual bool importerTest() { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/IRR/box.irr", aiProcess_ValidateDataStructure); + return nullptr != scene; + } +}; + +TEST_F(utIrrImportExport, importSimpleIrrTest) { + EXPECT_TRUE(importerTest()); +} + +TEST_F(utIrrImportExport, importSGIrrTest) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/IRR/dawfInCellar_SameHierarchy.irr", aiProcess_ValidateDataStructure); + EXPECT_NE( nullptr,scene); +} diff --git a/test/unit/ImportExport/RAW/utRAWImportExport.cpp b/test/unit/ImportExport/RAW/utRAWImportExport.cpp new file mode 100644 index 000000000..83719eeb0 --- /dev/null +++ b/test/unit/ImportExport/RAW/utRAWImportExport.cpp @@ -0,0 +1,64 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2020, 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 "AbstractImportExportBase.h" +#include "UnitTestPCH.h" +#include +#include +#include + +using namespace Assimp; + +class utRAWImportExport : public AbstractImportExportBase { +public: + virtual bool importerTest() { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/RAW/Wuson.raw", aiProcess_ValidateDataStructure); +#ifndef ASSIMP_BUILD_NO_RAW_IMPORTER + return nullptr != scene; +#else + return nullptr == scene; +#endif + } +}; + +TEST_F(utRAWImportExport, importSimpleRAWTest) { + EXPECT_TRUE(importerTest()); +} diff --git a/test/unit/ImportExport/Terragen/utTerragenImportExport.cpp b/test/unit/ImportExport/Terragen/utTerragenImportExport.cpp new file mode 100644 index 000000000..ea2de9fd0 --- /dev/null +++ b/test/unit/ImportExport/Terragen/utTerragenImportExport.cpp @@ -0,0 +1,60 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2020, 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 "AbstractImportExportBase.h" +#include "UnitTestPCH.h" + +#include +#include + +class utTerragenImportExport : public AbstractImportExportBase { +public: + virtual bool importerTest() { + /*Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/TER/RealisticTerrain.ter", aiProcess_ValidateDataStructure); + return nullptr != scene;*/ + return true; + } +}; + +TEST_F(utTerragenImportExport, importX3DFromFileTest) { + EXPECT_TRUE(importerTest()); +} diff --git a/test/unit/ImportExport/utCOBImportExport.cpp b/test/unit/ImportExport/utCOBImportExport.cpp index bd0260c0d..e0f423d92 100644 --- a/test/unit/ImportExport/utCOBImportExport.cpp +++ b/test/unit/ImportExport/utCOBImportExport.cpp @@ -39,7 +39,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------- */ -#include "SceneDiffer.h" #include "UnitTestPCH.h" #include diff --git a/test/unit/ImportExport/utOFFImportExport.cpp b/test/unit/ImportExport/utOFFImportExport.cpp index f8413e217..8e5de92d1 100644 --- a/test/unit/ImportExport/utOFFImportExport.cpp +++ b/test/unit/ImportExport/utOFFImportExport.cpp @@ -40,7 +40,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "AbstractImportExportBase.h" -#include "SceneDiffer.h" #include "UnitTestPCH.h" #include #include diff --git a/test/unit/ImportExport/utOgreImportExport.cpp b/test/unit/ImportExport/utOgreImportExport.cpp index a63afbb99..0c25a82cb 100644 --- a/test/unit/ImportExport/utOgreImportExport.cpp +++ b/test/unit/ImportExport/utOgreImportExport.cpp @@ -40,7 +40,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "AbstractImportExportBase.h" -#include "SceneDiffer.h" #include "UnitTestPCH.h" #include diff --git a/test/unit/ImportExport/utQ3BSPFileImportExport.cpp b/test/unit/ImportExport/utQ3BSPFileImportExport.cpp index cc3674850..e3dbf9f95 100644 --- a/test/unit/ImportExport/utQ3BSPFileImportExport.cpp +++ b/test/unit/ImportExport/utQ3BSPFileImportExport.cpp @@ -40,7 +40,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "AbstractImportExportBase.h" -#include "SceneDiffer.h" #include "UnitTestPCH.h" #include diff --git a/test/unit/MathTest.cpp b/test/unit/MathTest.cpp new file mode 100644 index 000000000..69b23f625 --- /dev/null +++ b/test/unit/MathTest.cpp @@ -0,0 +1,56 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2020, 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 "MathTest.h" + +namespace Assimp { + +// Initialize epsilon value. +const float AssimpMathTest::Epsilon = Math::getEpsilon(); + +// Initialize with an interval of [1,100]. +RandomUniformFloatGenerator AssimpMathTest::RandNonZero(1.0f, 100.0f); + +// Initialize with an interval of [-PI,PI] inclusively. +RandomUniformFloatGenerator AssimpMathTest::RandPI(-Math::PI(), Math::PI()); + +} diff --git a/test/unit/MathTest.h b/test/unit/MathTest.h new file mode 100644 index 000000000..19401b29a --- /dev/null +++ b/test/unit/MathTest.h @@ -0,0 +1,103 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2020, 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. +--------------------------------------------------------------------------- +*/ + +#ifndef ASSIMP_MATH_TEST_H +#define ASSIMP_MATH_TEST_H + +#include "UnitTestPCH.h" +#include +#include "RandomNumberGeneration.h" + +namespace Assimp { + +/** Custom test class providing several math related utilities. */ +class AssimpMathTest : public ::testing::Test { +public: + /** Return a random non-null 2D vector. */ + inline static aiVector2D random_vec2() { + return aiVector2D(RandNonZero.next(), RandNonZero.next()); + } + + /** Return a random non-null 3D vector. */ + inline static aiVector3D random_vec3() { + return aiVector3D(RandNonZero.next(), RandNonZero.next(),RandNonZero.next()); + } + + /** Return a random unit 3D vector. */ + inline static aiVector3D random_unit_vec3() { + return random_vec3().NormalizeSafe(); + } + + /** Return a quaternion with random orientation and + * rotation angle around axis. */ + inline static aiQuaternion random_quat() { + return aiQuaternion(random_unit_vec3(), RandPI.next()); + } + + /** Return a random non-null 3x3 matrix. */ + inline static aiMatrix3x3 random_mat3() { + return aiMatrix3x3( + RandNonZero.next(), RandNonZero.next(),RandNonZero.next(), + RandNonZero.next(), RandNonZero.next(),RandNonZero.next(), + RandNonZero.next(), RandNonZero.next(),RandNonZero.next()); + } + + /** Return a random non-null 4x4 matrix. */ + inline static aiMatrix4x4 random_mat4() { + return aiMatrix4x4( + RandNonZero.next(), RandNonZero.next(),RandNonZero.next(), RandNonZero.next(), + RandNonZero.next(), RandNonZero.next(),RandNonZero.next(), RandNonZero.next(), + RandNonZero.next(), RandNonZero.next(),RandNonZero.next(), RandNonZero.next(), + RandNonZero.next(), RandNonZero.next(),RandNonZero.next(), RandNonZero.next()); + } + + /** Epsilon value to use in tests. */ + static const float Epsilon; + + /** Random number generators. */ + static RandomUniformFloatGenerator RandNonZero, RandPI; +}; + +} + +#endif // ASSIMP_MATH_TEST_H diff --git a/test/unit/RandomNumberGeneration.h b/test/unit/RandomNumberGeneration.h new file mode 100644 index 000000000..a313f34ae --- /dev/null +++ b/test/unit/RandomNumberGeneration.h @@ -0,0 +1,82 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2020, 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. +--------------------------------------------------------------------------- +*/ + +#ifndef ASSIMP_RANDOM_NUMBER_GENERATION_H +#define ASSIMP_RANDOM_NUMBER_GENERATION_H + +#include + +namespace Assimp { + +/** Helper class to use for generating pseudo-random + * real numbers, with a uniform distribution. */ +template +class RandomUniformRealGenerator { +public: + RandomUniformRealGenerator() : + dist_(), + rd_(), + re_(rd_()) { + // empty + } + + RandomUniformRealGenerator(T min, T max) : + dist_(min, max), + rd_(), + re_(rd_()) { + // empty + } + + inline T next() { + return dist_(re_); + } + +private: + std::uniform_real_distribution dist_; + std::random_device rd_; + std::default_random_engine re_; +}; + +using RandomUniformFloatGenerator = RandomUniformRealGenerator; + +} + +#endif // ASSIMP_RANDOM_NUMBER_GENERATION_H diff --git a/test/unit/ut3DSImportExport.cpp b/test/unit/ut3DSImportExport.cpp index 7ffc66f1e..8debf6e86 100644 --- a/test/unit/ut3DSImportExport.cpp +++ b/test/unit/ut3DSImportExport.cpp @@ -40,7 +40,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "AbstractImportExportBase.h" -#include "SceneDiffer.h" #include "UnitTestPCH.h" #include diff --git a/test/unit/utAMFImportExport.cpp b/test/unit/utAMFImportExport.cpp index 0cbd59a67..e4406702a 100644 --- a/test/unit/utAMFImportExport.cpp +++ b/test/unit/utAMFImportExport.cpp @@ -40,7 +40,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "AbstractImportExportBase.h" -#include "SceneDiffer.h" #include "UnitTestPCH.h" #include diff --git a/test/unit/utASEImportExport.cpp b/test/unit/utASEImportExport.cpp index 5d138dcd5..2ddc81f29 100644 --- a/test/unit/utASEImportExport.cpp +++ b/test/unit/utASEImportExport.cpp @@ -40,7 +40,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "AbstractImportExportBase.h" -#include "SceneDiffer.h" #include "UnitTestPCH.h" #include diff --git a/test/unit/utArmaturePopulate.cpp b/test/unit/utArmaturePopulate.cpp index d00330ced..8a6036239 100644 --- a/test/unit/utArmaturePopulate.cpp +++ b/test/unit/utArmaturePopulate.cpp @@ -42,7 +42,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "UnitTestPCH.h" #include "AbstractImportExportBase.h" -#include "SceneDiffer.h" #include #include diff --git a/test/unit/utAssbinImportExport.cpp b/test/unit/utAssbinImportExport.cpp index d679914a9..a1f8c7511 100644 --- a/test/unit/utAssbinImportExport.cpp +++ b/test/unit/utAssbinImportExport.cpp @@ -39,7 +39,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------- */ #include "AbstractImportExportBase.h" -#include "SceneDiffer.h" #include "UnitTestPCH.h" #include #include diff --git a/test/unit/utB3DImportExport.cpp b/test/unit/utB3DImportExport.cpp index e79d87084..2f213aa8c 100644 --- a/test/unit/utB3DImportExport.cpp +++ b/test/unit/utB3DImportExport.cpp @@ -40,7 +40,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "AbstractImportExportBase.h" -#include "SceneDiffer.h" #include "UnitTestPCH.h" #include diff --git a/test/unit/utDXFImporterExporter.cpp b/test/unit/utDXFImporterExporter.cpp index c9791db7f..79289f82a 100644 --- a/test/unit/utDXFImporterExporter.cpp +++ b/test/unit/utDXFImporterExporter.cpp @@ -40,7 +40,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "AbstractImportExportBase.h" -#include "SceneDiffer.h" #include "UnitTestPCH.h" #include diff --git a/test/unit/utFBXImporterExporter.cpp b/test/unit/utFBXImporterExporter.cpp index 89b94dddc..88a3e067e 100644 --- a/test/unit/utFBXImporterExporter.cpp +++ b/test/unit/utFBXImporterExporter.cpp @@ -40,7 +40,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "AbstractImportExportBase.h" -#include "SceneDiffer.h" #include "UnitTestPCH.h" #include @@ -214,6 +213,10 @@ TEST_F(utFBXImporterExporter, importUnitScaleFactor) { double factor(0.0); scene->mMetaData->Get("UnitScaleFactor", factor); EXPECT_DOUBLE_EQ(500.0, factor); + + scene->mMetaData->Set("UnitScaleFactor", factor * 2); + scene->mMetaData->Get("UnitScaleFactor", factor); + EXPECT_DOUBLE_EQ(1000.0, factor); } TEST_F(utFBXImporterExporter, importEmbeddedAsciiTest) { diff --git a/test/unit/utImporter.cpp b/test/unit/utImporter.cpp index c559819a2..0be0037df 100644 --- a/test/unit/utImporter.cpp +++ b/test/unit/utImporter.cpp @@ -51,1335 +51,84 @@ using namespace ::std; using namespace ::Assimp; class ImporterTest : public ::testing::Test { -public: - virtual void SetUp() { +protected: + void SetUp() override { pImp = new Importer(); } - virtual void TearDown() { + void TearDown() override { delete pImp; } -protected: Importer *pImp; }; #define InputData_BLOCK_SIZE 1310 +// clang-format off // test data for Importer::ReadFileFromMemory() - ./test/3DS/CameraRollAnim.3ds static unsigned char InputData_abRawBlock[1310] = { - 77, - 77, - 30, - 5, - 0, - 0, - 2, - 0, - 10, - 0, - 0, - 0, - 3, - 0, - 0, - 0, - 61, - 61, - 91, - 3, - 0, - 0, - 62, - 61, - 10, - 0, - 0, - 0, - 3, - 0, - 0, - 0, - 0, - 1, - 10, - 0, - 0, - 0, - 0, - 0, - 128, - 63, - 0, - 64, - 254, - 2, - 0, - 0, - 66, - 111, - 120, - 48, - 49, - 0, - 0, - 65, - 242, - 2, - 0, - 0, - 16, - 65, - 64, - 1, - 0, - 0, - 26, - 0, - 102, - 74, - 198, - 193, - 102, - 74, - 198, - 193, - 0, - 0, - 0, - 0, - 205, - 121, - 55, - 66, - 102, - 74, - 198, - 193, - 0, - 0, - 0, - 0, - 102, - 74, - 198, - 193, - 138, - 157, - 184, - 65, - 0, - 0, - 0, - 0, - 205, - 121, - 55, - 66, - 138, - 157, - 184, - 65, - 0, - 0, - 0, - 0, - 102, - 74, - 198, - 193, - 102, - 74, - 198, - 193, - 90, - 252, - 26, - 66, - 205, - 121, - 55, - 66, - 102, - 74, - 198, - 193, - 90, - 252, - 26, - 66, - 102, - 74, - 198, - 193, - 138, - 157, - 184, - 65, - 90, - 252, - 26, - 66, - 205, - 121, - 55, - 66, - 138, - 157, - 184, - 65, - 90, - 252, - 26, - 66, - 102, - 74, - 198, - 193, - 102, - 74, - 198, - 193, - 0, - 0, - 0, - 0, - 205, - 121, - 55, - 66, - 102, - 74, - 198, - 193, - 0, - 0, - 0, - 0, - 205, - 121, - 55, - 66, - 102, - 74, - 198, - 193, - 90, - 252, - 26, - 66, - 205, - 121, - 55, - 66, - 102, - 74, - 198, - 193, - 90, - 252, - 26, - 66, - 102, - 74, - 198, - 193, - 102, - 74, - 198, - 193, - 90, - 252, - 26, - 66, - 102, - 74, - 198, - 193, - 102, - 74, - 198, - 193, - 0, - 0, - 0, - 0, - 205, - 121, - 55, - 66, - 138, - 157, - 184, - 65, - 0, - 0, - 0, - 0, - 205, - 121, - 55, - 66, - 102, - 74, - 198, - 193, - 90, - 252, - 26, - 66, - 205, - 121, - 55, - 66, - 138, - 157, - 184, - 65, - 0, - 0, - 0, - 0, - 102, - 74, - 198, - 193, - 138, - 157, - 184, - 65, - 0, - 0, - 0, - 0, - 102, - 74, - 198, - 193, - 138, - 157, - 184, - 65, - 90, - 252, - 26, - 66, - 102, - 74, - 198, - 193, - 138, - 157, - 184, - 65, - 90, - 252, - 26, - 66, - 205, - 121, - 55, - 66, - 138, - 157, - 184, - 65, - 90, - 252, - 26, - 66, - 205, - 121, - 55, - 66, - 138, - 157, - 184, - 65, - 0, - 0, - 0, - 0, - 102, - 74, - 198, - 193, - 138, - 157, - 184, - 65, - 0, - 0, - 0, - 0, - 102, - 74, - 198, - 193, - 102, - 74, - 198, - 193, - 90, - 252, - 26, - 66, - 102, - 74, - 198, - 193, - 102, - 74, - 198, - 193, - 90, - 252, - 26, - 66, - 102, - 74, - 198, - 193, - 138, - 157, - 184, - 65, - 0, - 0, - 0, - 0, - 64, - 65, - 216, - 0, - 0, - 0, - 26, - 0, - 0, - 0, - 128, - 63, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 128, - 63, - 0, - 0, - 128, - 63, - 0, - 0, - 0, - 0, - 0, - 0, - 128, - 63, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 128, - 63, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 128, - 63, - 0, - 0, - 128, - 63, - 0, - 0, - 128, - 63, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 128, - 63, - 0, - 0, - 0, - 0, - 0, - 0, - 128, - 63, - 0, - 0, - 128, - 63, - 0, - 0, - 128, - 63, - 0, - 0, - 128, - 63, - 0, - 0, - 0, - 0, - 0, - 0, - 128, - 63, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 128, - 63, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 128, - 63, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 128, - 63, - 0, - 0, - 0, - 0, - 0, - 0, - 128, - 63, - 0, - 0, - 128, - 63, - 0, - 0, - 128, - 63, - 0, - 0, - 128, - 63, - 0, - 0, - 0, - 0, - 0, - 0, - 128, - 63, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 128, - 63, - 0, - 0, - 128, - 63, - 0, - 0, - 128, - 63, - 0, - 0, - 128, - 63, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 96, - 65, - 54, - 0, - 0, - 0, - 0, - 0, - 128, - 63, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 128, - 63, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 128, - 63, - 53, - 169, - 40, - 65, - 176, - 205, - 90, - 191, - 0, - 0, - 0, - 0, - 32, - 65, - 158, - 0, - 0, - 0, - 12, - 0, - 0, - 0, - 2, - 0, - 3, - 0, - 6, - 0, - 3, - 0, - 1, - 0, - 0, - 0, - 6, - 0, - 4, - 0, - 5, - 0, - 7, - 0, - 6, - 0, - 7, - 0, - 6, - 0, - 4, - 0, - 6, - 0, - 8, - 0, - 9, - 0, - 10, - 0, - 6, - 0, - 11, - 0, - 12, - 0, - 13, - 0, - 6, - 0, - 1, - 0, - 14, - 0, - 7, - 0, - 6, - 0, - 7, - 0, - 15, - 0, - 1, - 0, - 6, - 0, - 16, - 0, - 17, - 0, - 18, - 0, - 6, - 0, - 19, - 0, - 20, - 0, - 21, - 0, - 6, - 0, - 22, - 0, - 0, - 0, - 23, - 0, - 6, - 0, - 24, - 0, - 6, - 0, - 25, - 0, - 6, - 0, - 80, - 65, - 54, - 0, - 0, - 0, - 2, - 0, - 0, - 0, - 2, - 0, - 0, - 0, - 4, - 0, - 0, - 0, - 4, - 0, - 0, - 0, - 8, - 0, - 0, - 0, - 8, - 0, - 0, - 0, - 16, - 0, - 0, - 0, - 16, - 0, - 0, - 0, - 32, - 0, - 0, - 0, - 32, - 0, - 0, - 0, - 64, - 0, - 0, - 0, - 64, - 0, - 0, - 0, - 0, - 64, - 67, - 0, - 0, - 0, - 67, - 97, - 109, - 101, - 114, - 97, - 48, - 49, - 0, - 0, - 71, - 52, - 0, - 0, - 0, - 189, - 19, - 25, - 195, - 136, - 104, - 81, - 64, - 147, - 56, - 182, - 65, - 96, - 233, - 20, - 194, - 67, - 196, - 97, - 190, - 147, - 56, - 182, - 65, - 0, - 0, - 0, - 0, - 85, - 85, - 85, - 66, - 32, - 71, - 14, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 122, - 68, - 0, - 176, - 179, - 1, - 0, - 0, - 10, - 176, - 21, - 0, - 0, - 0, - 5, - 0, - 77, - 65, - 88, - 83, - 67, - 69, - 78, - 69, - 0, - 44, - 1, - 0, - 0, - 8, - 176, - 14, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 44, - 1, - 0, - 0, - 9, - 176, - 10, - 0, - 0, - 0, - 128, - 2, - 0, - 0, - 2, - 176, - 168, - 0, - 0, - 0, - 48, - 176, - 8, - 0, - 0, - 0, - 0, - 0, - 16, - 176, - 18, - 0, - 0, - 0, - 66, - 111, - 120, - 48, - 49, - 0, - 0, - 64, - 0, - 0, - 255, - 255, - 19, - 176, - 18, - 0, - 0, - 0, - 0, - 0, - 0, - 128, - 0, - 0, - 0, - 128, - 0, - 0, - 0, - 128, - 32, - 176, - 38, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 53, - 169, - 40, - 65, - 176, - 205, - 90, - 191, - 0, - 0, - 0, - 0, - 33, - 176, - 42, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 34, - 176, - 38, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 128, - 63, - 0, - 0, - 128, - 63, - 0, - 0, - 128, - 63, - 3, - 176, - 143, - 0, - 0, - 0, - 48, - 176, - 8, - 0, - 0, - 0, - 1, - 0, - 16, - 176, - 21, - 0, - 0, - 0, - 67, - 97, - 109, - 101, - 114, - 97, - 48, - 49, - 0, - 0, - 64, - 0, - 0, - 255, - 255, - 32, - 176, - 38, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 189, - 19, - 25, - 195, - 136, - 104, - 81, - 64, - 147, - 56, - 182, - 65, - 35, - 176, - 30, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 52, - 66, - 36, - 176, - 40, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 120, - 0, - 0, - 0, - 2, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 120, - 13, - 90, - 189, - 120, - 0, - 0, - 0, - 0, - 0, - 99, - 156, - 154, - 194, - 4, - 176, - 73, - 0, - 0, - 0, - 48, - 176, - 8, - 0, - 0, - 0, - 2, - 0, - 16, - 176, - 21, - 0, - 0, - 0, - 67, - 97, - 109, - 101, - 114, - 97, - 48, - 49, - 0, - 0, - 64, - 0, - 0, - 255, - 255, - 32, - 176, - 38, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 96, - 233, - 20, - 194, - 67, - 196, - 97, - 190, - 147, - 56, - 182, - 65, -}; - + 77, 77, 30, 5, 0, 0, 2, 0, 10, 0, 0, 0, 3, 0, 0, 0, 61, 61, 91, 3, 0, 0, + 62, 61, 10, 0, 0, 0, 3, 0, 0, 0, 0, 1, 10, 0, 0, 0, 0, 0,128, 63, 0, 64, + 254, 2, 0, 0, 66,111,120, 48, 49, 0, 0, 65,242, 2, 0, 0, 16, 65, 64, 1, 0, 0, + 26, 0,102, 74,198,193,102, 74,198,193, 0, 0, 0, 0,205,121, 55, 66,102, 74,198,193, + 0, 0, 0, 0,102, 74,198,193,138,157,184, 65, 0, 0, 0, 0,205,121, 55, 66,138,157, + 184, 65, 0, 0, 0, 0,102, 74,198,193,102, 74,198,193, 90,252, 26, 66,205,121, 55, 66, + 102, 74,198,193, 90,252, 26, 66,102, 74,198,193,138,157,184, 65, 90,252, 26, 66,205,121, + 55, 66,138,157,184, 65, 90,252, 26, 66,102, 74,198,193,102, 74,198,193, 0, 0, 0, 0, + 205,121, 55, 66,102, 74,198,193, 0, 0, 0, 0,205,121, 55, 66,102, 74,198,193, 90,252, + 26, 66,205,121, 55, 66,102, 74,198,193, 90,252, 26, 66,102, 74,198,193,102, 74,198,193, + 90, 252, 26, 66,102, 74,198,193,102, 74,198,193, 0, 0, 0, 0,205,121, 55, 66,138,157, + 184, 65, 0, 0, 0, 0,205,121, 55, 66,102, 74,198,193, 90,252, 26, 66,205,121, 55, 66, + 138,157,184, 65, 0, 0, 0, 0,102, 74,198,193,138,157,184, 65, 0, 0, 0, 0,102, 74, + 198,193,138,157,184, 65, 90,252, 26, 66,102, 74,198,193,138,157,184, 65, 90,252, 26, 66, + 205,121, 55, 66,138,157,184, 65, 90,252, 26, 66,205,121, 55, 66,138,157,184, 65, 0, 0, + 0, 0,102, 74,198,193,138,157,184, 65, 0, 0, 0, 0,102, 74,198,193,102, 74,198,193, + 90,252, 26, 66,102, 74,198,193,102, 74,198,193, 90,252, 26, 66,102, 74,198,193,138,157, + 184, 65, 0, 0, 0, 0, 64, 65,216, 0, 0, 0, 26, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, + 128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, + 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 65, 54, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 53,169, 40, 65,176,205, 90,191, 0, 0, 0, 0, 32, 65,158, 0, 0, 0, 12, 0, 0, 0, + 2, 0, 3, 0, 6, 0, 3, 0, 1, 0, 0, 0, 6, 0, 4, 0, 5, 0, 7, 0, 6, 0, + 7, 0, 6, 0, 4, 0, 6, 0, 8, 0, 9, 0, 10, 0, 6, 0, 11, 0, 12, 0, 13, 0, + 6, 0, 1, 0, 14, 0, 7, 0, 6, 0, 7, 0, 15, 0, 1, 0, 6, 0, 16, 0, 17, 0, + 18, 0, 6, 0, 19, 0, 20, 0, 21, 0, 6, 0, 22, 0, 0, 0, 23, 0, 6, 0, 24, 0, + 6, 0, 25, 0, 6, 0, 80, 65, 54, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, + 32, 0, 0, 0, 32, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 0, 0, 64, 67, 0, 0, 0, + 67, 97,109,101,114, 97, 48, 49, 0, 0, 71, 52, 0, 0, 0,189, 19, 25,195,136,104, 81, + 64,147, 56,182, 65, 96,233, 20,194, 67,196, 97,190,147, 56,182, 65, 0, 0, 0, 0, 85, + 85, 85, 66, 32, 71, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 68, 0,176,179, 1, 0, + 0, 10,176, 21, 0, 0, 0, 5, 0, 77, 65, 88, 83, 67, 69, 78, 69, 0, 44, 1, 0, 0, + 8,176, 14, 0, 0, 0, 0, 0, 0, 0, 44, 1, 0, 0, 9,176, 10, 0, 0, 0,128, 2, + 0, 0, 2,176,168, 0, 0, 0, 48,176, 8, 0, 0, 0, 0, 0, 16,176, 18, 0, 0, 0, + 66,111,120, 48, 49, 0, 0, 64, 0, 0,255,255, 19,176, 18, 0, 0, 0, 0, 0, 0,128, + 0, 0, 0,128, 0, 0, 0,128, 32,176, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53,169, 40, 65,176,205, 90,191, 0, 0, + 0, 0, 33,176, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34,176, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 3,176,143, 0, 0, 0, + 48,176, 8, 0, 0, 0, 1, 0, 16,176, 21, 0, 0, 0, 67, 97,109,101,114, 97, 48, 49, + 0, 0, 64, 0, 0,255,255, 32,176, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,189, 19, 25,195,136,104, 81, 64,147, 56,182, + 65, 35,176, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 52, 66, 36,176, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 13, 90,189,120, 0, 0, 0, 0, + 0, 99,156,154,194, 4,176, 73, 0, 0, 0, 48,176, 8, 0, 0, 0, 2, 0, 16,176, 21, + 0, 0, 0, 67, 97,109,101,114, 97, 48, 49, 0, 0, 64, 0, 0,255,255, 32,176, 38, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96,233, 20,194, 67,196, 97,190,147, 56,182, 65 }; +// clang-format on #define AIUT_DEF_ERROR_TEXT "sorry, this is a test" static const aiImporterDesc desc = { diff --git a/test/unit/utM3DImportExport.cpp b/test/unit/utM3DImportExport.cpp index 0fc5d2ff3..bd9fca168 100644 --- a/test/unit/utM3DImportExport.cpp +++ b/test/unit/utM3DImportExport.cpp @@ -41,9 +41,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "AbstractImportExportBase.h" -#include "SceneDiffer.h" #include "UnitTestPCH.h" +#include +#include #include #include @@ -51,17 +52,33 @@ using namespace Assimp; class utM3DImportExport : public AbstractImportExportBase { public: - virtual bool importerTest() { + bool importerTest() override { Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/M3D/cube_normals.m3d", aiProcess_ValidateDataStructure); #ifndef ASSIMP_BUILD_NO_M3D_IMPORTER - return nullptr != scene; + return nullptr != scene; #else return nullptr == scene; #endif // ASSIMP_BUILD_NO_M3D_IMPORTER } + +#ifndef ASSIMP_BUILD_NO_EXPORT + bool exporterTest() override { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/M3D/cube_normals.m3d", aiProcess_ValidateDataStructure); + Exporter exporter; + aiReturn ret = exporter.Export(scene, "m3d", ASSIMP_TEST_MODELS_DIR "/M3D/cube_normals_out.m3d"); + return ret == AI_SUCCESS; + } +#endif }; TEST_F(utM3DImportExport, importM3DFromFileTest) { EXPECT_TRUE(importerTest()); } + +#ifndef ASSIMP_BUILD_NO_EXPORT +TEST_F(utM3DImportExport, exportM3DFromFileTest) { + EXPECT_TRUE(exporterTest()); +} +#endif // ASSIMP_BUILD_NO_EXPORT diff --git a/test/unit/utPMXImporter.cpp b/test/unit/utPMXImporter.cpp index d70c4c64e..5ab7a9d6a 100644 --- a/test/unit/utPMXImporter.cpp +++ b/test/unit/utPMXImporter.cpp @@ -40,7 +40,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "UnitTestPCH.h" -#include "SceneDiffer.h" #include "AbstractImportExportBase.h" #include "MMD/MMDImporter.h" diff --git a/test/unit/utSTLImportExport.cpp b/test/unit/utSTLImportExport.cpp index 94417e260..2b4c3873f 100644 --- a/test/unit/utSTLImportExport.cpp +++ b/test/unit/utSTLImportExport.cpp @@ -40,7 +40,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "AbstractImportExportBase.h" -#include "SceneDiffer.h" #include "UnitTestPCH.h" #include diff --git a/test/unit/utStringUtils.cpp b/test/unit/utStringUtils.cpp index c5493c502..cb91897e3 100644 --- a/test/unit/utStringUtils.cpp +++ b/test/unit/utStringUtils.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2020, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, diff --git a/test/unit/utX3DImportExport.cpp b/test/unit/utX3DImportExport.cpp index c19842895..5b3438d91 100644 --- a/test/unit/utX3DImportExport.cpp +++ b/test/unit/utX3DImportExport.cpp @@ -40,7 +40,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "AbstractImportExportBase.h" -#include "SceneDiffer.h" #include "UnitTestPCH.h" #include diff --git a/test/unit/utXImporterExporter.cpp b/test/unit/utXImporterExporter.cpp index 07f857227..39cda4e35 100644 --- a/test/unit/utXImporterExporter.cpp +++ b/test/unit/utXImporterExporter.cpp @@ -40,7 +40,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "AbstractImportExportBase.h" -#include "SceneDiffer.h" #include "UnitTestPCH.h" #include diff --git a/test/unit/utglTF2ImportExport.cpp b/test/unit/utglTF2ImportExport.cpp index 23901b9b2..55cd2ef6a 100644 --- a/test/unit/utglTF2ImportExport.cpp +++ b/test/unit/utglTF2ImportExport.cpp @@ -491,6 +491,12 @@ TEST_F(utglTF2ImportExport, texcoords) { EXPECT_EQ(uvIndex, 1); } +TEST_F(utglTF2ImportExport, recursive_nodes) { + Assimp::Importer importer; + const aiScene* scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/RecursiveNodes/RecursiveNodes.gltf", aiProcess_ValidateDataStructure); + EXPECT_EQ(nullptr, scene); +} + TEST_F(utglTF2ImportExport, norootnode_noscene) { Assimp::Importer importer; const aiScene* scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/TestNoRootNode/NoScene.gltf", aiProcess_ValidateDataStructure); diff --git a/tools/assimp_view/Background.cpp b/tools/assimp_view/Background.cpp index e5f4e2b96..d1db3b60a 100644 --- a/tools/assimp_view/Background.cpp +++ b/tools/assimp_view/Background.cpp @@ -101,7 +101,7 @@ void CBackgroundPainter::SetColor (D3DCOLOR p_clrNew) if (pcTexture) { pcTexture->Release(); - pcTexture = NULL; + pcTexture = nullptr; } } //------------------------------------------------------------------------------- @@ -135,7 +135,7 @@ void CBackgroundPainter::SetCubeMapBG (const char* p_szPath) if (pcTexture) { pcTexture->Release(); - pcTexture = NULL; + pcTexture = nullptr; if(TEXTURE_CUBE ==eMode)bHad = true; } @@ -199,7 +199,7 @@ void CBackgroundPainter::SetTextureBG (const char* p_szPath) if (pcTexture) { pcTexture->Release(); - pcTexture = NULL; + pcTexture = nullptr; } eMode = TEXTURE_2D; @@ -223,12 +223,12 @@ void CBackgroundPainter::OnPreRender() // the color buffer ) if (g_sOptions.eDrawMode == RenderOptions::WIREFRAME) { - g_piDevice->Clear(0,NULL,D3DCLEAR_ZBUFFER | D3DCLEAR_TARGET, + g_piDevice->Clear(0,nullptr,D3DCLEAR_ZBUFFER | D3DCLEAR_TARGET, D3DCOLOR_ARGB(0xff,100,100,100),1.0f,0); } else { - g_piDevice->Clear(0,NULL,D3DCLEAR_ZBUFFER,0,1.0f,0); + g_piDevice->Clear(0,nullptr,D3DCLEAR_ZBUFFER,0,1.0f,0); } if (TEXTURE_2D == eMode) @@ -293,7 +293,7 @@ void CBackgroundPainter::OnPreRender() return; } // clear both the render target and the z-buffer - g_piDevice->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, + g_piDevice->Clear(0,nullptr,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, clrColor,1.0f,0); } //------------------------------------------------------------------------------- @@ -342,12 +342,12 @@ void CBackgroundPainter::ReleaseNativeResource() if ( piSkyBoxEffect) { piSkyBoxEffect->Release(); - piSkyBoxEffect = NULL; + piSkyBoxEffect = nullptr; } if (pcTexture) { pcTexture->Release(); - pcTexture = NULL; + pcTexture = nullptr; } } //------------------------------------------------------------------------------- @@ -377,8 +377,8 @@ void CBackgroundPainter::RecreateNativeResource() D3DX_DEFAULT, D3DX_DEFAULT, 0, - NULL, - NULL, + nullptr, + nullptr, (IDirect3DCubeTexture9**)&pcTexture))) { const char* szEnd = strrchr(szPath.c_str(),'\\'); @@ -411,8 +411,8 @@ void CBackgroundPainter::RecreateNativeResource() D3DX_DEFAULT, D3DX_DEFAULT, 0, - NULL, - NULL, + nullptr, + nullptr, (IDirect3DTexture9**)&pcTexture))) { const char* szEnd = strrchr(szPath.c_str(),'\\'); @@ -433,15 +433,15 @@ void CBackgroundPainter::RecreateNativeResource() } if (!piSkyBoxEffect) { - ID3DXBuffer* piBuffer = NULL; + ID3DXBuffer* piBuffer = nullptr; if(FAILED( D3DXCreateEffect( g_piDevice, g_szSkyboxShader.c_str(), (UINT)g_szSkyboxShader.length(), - NULL, - NULL, + nullptr, + nullptr, AI_SHADER_COMPILE_FLAGS, - NULL, + nullptr, &piSkyBoxEffect,&piBuffer))) { // failed to compile the shader diff --git a/tools/assimp_view/Display.cpp b/tools/assimp_view/Display.cpp index f66f6bc92..9fa157c41 100644 --- a/tools/assimp_view/Display.cpp +++ b/tools/assimp_view/Display.cpp @@ -158,8 +158,8 @@ int CDisplay::AddNodeToDisplayList( aiNode* pcNode, HTREEITEM hRoot) { - ai_assert(NULL != pcNode); - ai_assert(NULL != hRoot); + ai_assert(nullptr != pcNode); + ai_assert(nullptr != hRoot); char chTemp[MAXLEN]; @@ -269,13 +269,13 @@ int CDisplay::AddMeshToDisplayList(unsigned int iIndex, HTREEITEM hRoot) // Replace the currently selected texture by another one int CDisplay::ReplaceCurrentTexture(const char* szPath) { - ai_assert(NULL != szPath); + ai_assert(nullptr != szPath); // well ... try to load it - IDirect3DTexture9* piTexture = NULL; + IDirect3DTexture9* piTexture = nullptr; aiString szString; strcpy(szString.data,szPath); - szString.length = strlen(szPath); + szString.length = static_cast(strlen(szPath)); CMaterialManager::Instance().LoadTexture(&piTexture,&szString); if (!piTexture) { @@ -301,8 +301,8 @@ int CDisplay::ReplaceCurrentTexture(const char* szPath) continue; AssetHelper::MeshHelper* pcMesh = g_pcAsset->apcMeshes[i]; - IDirect3DTexture9** tex = NULL; - const char* tex_string = NULL; + IDirect3DTexture9** tex = nullptr; + const char* tex_string = nullptr; switch (this->m_pcCurrentTexture->iType) { @@ -378,7 +378,7 @@ int CDisplay::AddTextureToDisplayList(unsigned int iType, aiTextureOp eTextureOp /*= aiTextureOp_Multiply*/, unsigned int iMesh /*= 0*/) { - ai_assert(NULL != szPath); + ai_assert(nullptr != szPath); char chTemp[512]; char chTempEmb[256]; @@ -388,8 +388,8 @@ int CDisplay::AddTextureToDisplayList(unsigned int iType, { if ('*' == *szPath->data) { - int iIndex = atoi(szPath->data+1); - ai_snprintf(chTempEmb,256,"Embedded #%i",iIndex); + int iIndex2 = atoi(szPath->data+1); + ai_snprintf(chTempEmb,256,"Embedded #%i",iIndex2); sz = chTempEmb; } else @@ -436,15 +436,15 @@ int CDisplay::AddTextureToDisplayList(unsigned int iType, szType = "Lightmap"; break; case aiTextureType_DISPLACEMENT: - piTexture = NULL; + piTexture = nullptr; szType = "Displacement"; break; case aiTextureType_REFLECTION: - piTexture = NULL; + piTexture = nullptr; szType = "Reflection"; break; case aiTextureType_UNKNOWN: - piTexture = NULL; + piTexture = nullptr; szType = "Unknown"; break; default: // opacity + opacity | mask @@ -521,7 +521,7 @@ int CDisplay::AddTextureToDisplayList(unsigned int iType, int CDisplay::AddMaterialToDisplayList(HTREEITEM hRoot, unsigned int iIndex) { - ai_assert(NULL != hRoot); + ai_assert(nullptr != hRoot); aiMaterial* pcMat = g_pcAsset->pcScene->mMaterials[iIndex]; @@ -583,7 +583,7 @@ int CDisplay::AddMaterialToDisplayList(HTREEITEM hRoot, while (true) { if (AI_SUCCESS != aiGetMaterialTexture(pcMat,(aiTextureType)i,iNum, - &szPath,NULL, &iUV,&fBlend,&eOp)) + &szPath,nullptr, &iUV,&fBlend,&eOp)) { break; } @@ -658,23 +658,23 @@ int CDisplay::LoadImageList(void) // Load the bitmaps and add them to the image lists. HBITMAP hBmp = LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_BFX)); - m_aiImageList[AI_VIEW_IMGLIST_MATERIAL] = ImageList_Add(hIml, hBmp, NULL); + m_aiImageList[AI_VIEW_IMGLIST_MATERIAL] = ImageList_Add(hIml, hBmp, nullptr); DeleteObject(hBmp); hBmp = LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_BNODE)); - m_aiImageList[AI_VIEW_IMGLIST_NODE] = ImageList_Add(hIml, hBmp, NULL); + m_aiImageList[AI_VIEW_IMGLIST_NODE] = ImageList_Add(hIml, hBmp, nullptr); DeleteObject(hBmp); hBmp = LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_BTX)); - m_aiImageList[AI_VIEW_IMGLIST_TEXTURE] = ImageList_Add(hIml, hBmp, NULL); + m_aiImageList[AI_VIEW_IMGLIST_TEXTURE] = ImageList_Add(hIml, hBmp, nullptr); DeleteObject(hBmp); hBmp = LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_BTXI)); - m_aiImageList[AI_VIEW_IMGLIST_TEXTURE_INVALID] = ImageList_Add(hIml, hBmp, NULL); + m_aiImageList[AI_VIEW_IMGLIST_TEXTURE_INVALID] = ImageList_Add(hIml, hBmp, nullptr); DeleteObject(hBmp); hBmp = LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_BROOT)); - m_aiImageList[AI_VIEW_IMGLIST_MODEL] = ImageList_Add(hIml, hBmp, NULL); + m_aiImageList[AI_VIEW_IMGLIST_MODEL] = ImageList_Add(hIml, hBmp, nullptr); DeleteObject(hBmp); // Associate the image list with the tree. @@ -778,7 +778,7 @@ int CDisplay::OnRender() // present the back-buffer g_piDevice->EndScene(); - g_piDevice->Present(NULL,NULL,NULL,NULL); + g_piDevice->Present(nullptr,nullptr,nullptr,nullptr); // don't remove this, problems on some older machines (AMD timing bug) Sleep(10); @@ -788,9 +788,9 @@ int CDisplay::OnRender() // Update UI void UpdateColorFieldsInUI() { - InvalidateRect(GetDlgItem(g_hDlg,IDC_LCOLOR1),NULL,TRUE); - InvalidateRect(GetDlgItem(g_hDlg,IDC_LCOLOR2),NULL,TRUE); - InvalidateRect(GetDlgItem(g_hDlg,IDC_LCOLOR3),NULL,TRUE); + InvalidateRect(GetDlgItem(g_hDlg,IDC_LCOLOR1),nullptr,TRUE); + InvalidateRect(GetDlgItem(g_hDlg,IDC_LCOLOR2),nullptr,TRUE); + InvalidateRect(GetDlgItem(g_hDlg,IDC_LCOLOR3),nullptr,TRUE); UpdateWindow(GetDlgItem(g_hDlg,IDC_LCOLOR1)); UpdateWindow(GetDlgItem(g_hDlg,IDC_LCOLOR2)); @@ -859,7 +859,7 @@ int CDisplay::Reset(void) m_asNodes.clear(); m_asMeshes.clear(); - m_hRoot = NULL; + m_hRoot = nullptr; return OnSetupNormalView(); } @@ -896,9 +896,9 @@ int CDisplay::OnSetupNormalView() SetViewMode(VIEWMODE_FULL); // for debugging - m_pcCurrentMaterial = NULL; - m_pcCurrentTexture = NULL; - m_pcCurrentNode = NULL; + m_pcCurrentMaterial = nullptr; + m_pcCurrentTexture = nullptr; + m_pcCurrentNode = nullptr; // redraw the color fields in the UI --- their purpose has possibly changed UpdateColorFieldsInUI(); @@ -908,7 +908,7 @@ int CDisplay::OnSetupNormalView() //------------------------------------------------------------------------------- int CDisplay::OnSetupNodeView(NodeInfo* pcNew) { - ai_assert(NULL != pcNew); + ai_assert(nullptr != pcNew); if (m_pcCurrentNode == pcNew)return 2; @@ -955,7 +955,7 @@ int CDisplay::OnSetupNodeView(NodeInfo* pcNew) //------------------------------------------------------------------------------- int CDisplay::OnSetupMaterialView(MaterialInfo* pcNew) { - ai_assert(NULL != pcNew); + ai_assert(nullptr != pcNew); if (m_pcCurrentMaterial == pcNew)return 2; @@ -973,7 +973,7 @@ int CDisplay::OnSetupMaterialView(MaterialInfo* pcNew) //------------------------------------------------------------------------------- int CDisplay::OnSetupTextureView(TextureInfo* pcNew) { - ai_assert(NULL != pcNew); + ai_assert(nullptr != pcNew); if (this->m_pcCurrentTexture == pcNew)return 2; @@ -1099,7 +1099,7 @@ int CDisplay::OnSetup(HTREEITEM p_hTreeItem) MaterialInfo* pcNew3; }; - pcNew = NULL; + pcNew = nullptr; for (std::vector::iterator i = m_asTextures.begin();i != m_asTextures.end();++i){ if (p_hTreeItem == (*i).hTreeItem) { pcNew = &(*i); @@ -1136,12 +1136,12 @@ int CDisplay::OnSetup(HTREEITEM p_hTreeItem) //------------------------------------------------------------------------------- int CDisplay::ShowTreeViewContextMenu(HTREEITEM hItem) { - ai_assert(NULL != hItem); + ai_assert(nullptr != hItem); - HMENU hDisplay = NULL; + HMENU hDisplay = nullptr; // search in our list for the item - TextureInfo* pcNew = NULL; + TextureInfo* pcNew = nullptr; for (std::vector::iterator i = m_asTextures.begin(); i != m_asTextures.end();++i) @@ -1158,7 +1158,7 @@ int CDisplay::ShowTreeViewContextMenu(HTREEITEM hItem) } // search in the material list for the item - MaterialInfo* pcNew2 = NULL; + MaterialInfo* pcNew2 = nullptr; for (std::vector::iterator i = m_asMaterials.begin(); i != m_asMaterials.end();++i) @@ -1173,7 +1173,7 @@ int CDisplay::ShowTreeViewContextMenu(HTREEITEM hItem) HMENU hMenu = LoadMenu(g_hInstance,MAKEINTRESOURCE(IDR_MATPOPUP)); hDisplay = GetSubMenu(hMenu,0); } - if (NULL != hDisplay) + if (nullptr != hDisplay) { // select this entry (this should all OnSetup()) TreeView_Select(GetDlgItem(g_hDlg,IDC_TREE1),hItem,TVGN_CARET); @@ -1185,7 +1185,7 @@ int CDisplay::ShowTreeViewContextMenu(HTREEITEM hItem) POINT sPoint; GetCursorPos(&sPoint); TrackPopupMenu(hDisplay, TPM_LEFTALIGN, sPoint.x, sPoint.y, 0, - g_hDlg,NULL); + g_hDlg,nullptr); } return 1; } @@ -1260,8 +1260,8 @@ int CDisplay::HandleTreeViewPopup(WPARAM wParam,LPARAM lParam) clamp(clrOld.g * 255.0f), clamp(clrOld.b * 255.0f)); clr.lpCustColors = g_aclCustomColors; - clr.lpfnHook = NULL; - clr.lpTemplateName = NULL; + clr.lpfnHook = nullptr; + clr.lpTemplateName = nullptr; clr.lCustData = 0; ChooseColor(&clr); @@ -1308,7 +1308,7 @@ int CALLBACK TreeViewCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSo return 0; } //------------------------------------------------------------------------------- -int CDisplay::HandleTreeViewPopup2(WPARAM wParam,LPARAM lParam) +int CDisplay::HandleTreeViewPopup2(WPARAM wParam,LPARAM /*lParam*/) { char szFileName[MAX_PATH]; DWORD dwTemp = MAX_PATH; @@ -1318,7 +1318,7 @@ int CDisplay::HandleTreeViewPopup2(WPARAM wParam,LPARAM lParam) case ID_HEY_REPLACE: { // get a path to a new texture - if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"ReplaceTextureSrc",NULL,NULL, + if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"ReplaceTextureSrc",nullptr,nullptr, (BYTE*)szFileName,&dwTemp)) { // Key was not found. Use C: @@ -1335,13 +1335,13 @@ int CDisplay::HandleTreeViewPopup2(WPARAM wParam,LPARAM lParam) } OPENFILENAME sFilename1 = { sizeof(OPENFILENAME), - g_hDlg,GetModuleHandle(NULL), + g_hDlg,GetModuleHandle(nullptr), "Textures\0*.png;*.dds;*.tga;*.bmp;*.tif;*.ppm;*.ppx;*.jpg;*.jpeg;*.exr\0*.*\0", - NULL, 0, 1, - szFileName, MAX_PATH, NULL, 0, NULL, + nullptr, 0, 1, + szFileName, MAX_PATH, nullptr, 0, nullptr, "Replace this texture", OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_NOCHANGEDIR, - 0, 1, ".jpg", 0, NULL, NULL + 0, 1, ".jpg", 0, nullptr, nullptr }; if(GetOpenFileName(&sFilename1) == 0) return 0; @@ -1353,7 +1353,7 @@ int CDisplay::HandleTreeViewPopup2(WPARAM wParam,LPARAM lParam) case ID_HEY_EXPORT: { - if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"TextureExportDest",NULL,NULL, + if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"TextureExportDest",nullptr,nullptr, (BYTE*)szFileName,&dwTemp)) { // Key was not found. Use C: @@ -1370,12 +1370,12 @@ int CDisplay::HandleTreeViewPopup2(WPARAM wParam,LPARAM lParam) } OPENFILENAME sFilename1 = { sizeof(OPENFILENAME), - g_hDlg,GetModuleHandle(NULL), - "Textures\0*.png;*.dds;*.bmp;*.tif;*.pfm;*.jpg;*.jpeg;*.hdr\0*.*\0", NULL, 0, 1, - szFileName, MAX_PATH, NULL, 0, NULL, + g_hDlg,GetModuleHandle(nullptr), + "Textures\0*.png;*.dds;*.bmp;*.tif;*.pfm;*.jpg;*.jpeg;*.hdr\0*.*\0", nullptr, 0, 1, + szFileName, MAX_PATH, nullptr, 0, nullptr, "Export texture to file", OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_NOCHANGEDIR, - 0, 1, ".png", 0, NULL, NULL + 0, 1, ".png", 0, nullptr, nullptr }; if(GetSaveFileName(&sFilename1) == 0) return 0; @@ -1397,9 +1397,9 @@ int CDisplay::HandleTreeViewPopup2(WPARAM wParam,LPARAM lParam) } // get a pointer to the first surface of the current texture - IDirect3DSurface9* pi = NULL; + IDirect3DSurface9* pi = nullptr; (*this->m_pcCurrentTexture->piTexture)->GetSurfaceLevel(0,&pi); - if(!pi || FAILED(D3DXSaveSurfaceToFile(szFileName,eFormat,pi,NULL,NULL))) + if(!pi || FAILED(D3DXSaveSurfaceToFile(szFileName,eFormat,pi,nullptr,nullptr))) { CLogDisplay::Instance().AddEntry("[ERROR] Unable to export texture", D3DCOLOR_ARGB(0xFF,0xFF,0,0)); @@ -1495,7 +1495,7 @@ int CDisplay::HandleTreeViewPopup2(WPARAM wParam,LPARAM lParam) // Setup stereo view int CDisplay::SetupStereoView() { - if (NULL != g_pcAsset && NULL != g_pcAsset->pcScene->mRootNode) + if (nullptr != g_pcAsset && nullptr != g_pcAsset->pcScene->mRootNode) { // enable the RED, GREEN and ALPHA channels g_piDevice->SetRenderState(D3DRS_COLORWRITEENABLE, @@ -1513,7 +1513,7 @@ int CDisplay::SetupStereoView() int CDisplay::RenderStereoView(const aiMatrix4x4& m) { // and rerender the scene - if (NULL != g_pcAsset && NULL != g_pcAsset->pcScene->mRootNode) + if (nullptr != g_pcAsset && nullptr != g_pcAsset->pcScene->mRootNode) { // enable the BLUE, GREEN and ALPHA channels g_piDevice->SetRenderState(D3DRS_COLORWRITEENABLE, @@ -1522,7 +1522,7 @@ int CDisplay::RenderStereoView(const aiMatrix4x4& m) D3DCOLORWRITEENABLE_BLUE); // clear the z-buffer - g_piDevice->Clear(0,NULL,D3DCLEAR_ZBUFFER,0,1.0f,0); + g_piDevice->Clear(0,nullptr,D3DCLEAR_ZBUFFER,0,1.0f,0); // move the camera a little bit to the right g_sCamera.vPos += g_sCamera.vRight * 0.06f; @@ -1751,7 +1751,7 @@ int CDisplay::RenderFullScene() // draw all opaque objects in the scene aiMatrix4x4 m; - if (NULL != g_pcAsset && NULL != g_pcAsset->pcScene->mRootNode) + if (nullptr != g_pcAsset && nullptr != g_pcAsset->pcScene->mRootNode) { HandleInput(); m = g_mWorld * g_mWorldRotate; @@ -1766,7 +1766,7 @@ int CDisplay::RenderFullScene() CBackgroundPainter::Instance().OnPostRender(); // draw all non-opaque objects in the scene - if (NULL != g_pcAsset && NULL != g_pcAsset->pcScene->mRootNode) + if (nullptr != g_pcAsset && nullptr != g_pcAsset->pcScene->mRootNode) { // disable the z-buffer if (!g_sOptions.bNoAlphaBlending) { @@ -1784,7 +1784,7 @@ int CDisplay::RenderFullScene() RenderStereoView(m); // render the skeleton if necessary - if (g_sOptions.bSkeleton && NULL != g_pcAsset && NULL != g_pcAsset->pcScene->mRootNode) { + if (g_sOptions.bSkeleton && nullptr != g_pcAsset && nullptr != g_pcAsset->pcScene->mRootNode) { // disable the z-buffer g_piDevice->SetRenderState(D3DRS_ZWRITEENABLE,FALSE); @@ -1795,11 +1795,11 @@ int CDisplay::RenderFullScene() g_piDevice->SetVertexDeclaration( gDefaultVertexDecl); // this is very similar to the code in SetupMaterial() ID3DXEffect* piEnd = g_piNormalsEffect; - aiMatrix4x4 pcProj = m * mViewProjection; + aiMatrix4x4 pcProj2 = m * mViewProjection; D3DXVECTOR4 vVector(1.f,0.f,0.f,1.f); piEnd->SetVector("OUTPUT_COLOR",&vVector); - piEnd->SetMatrix("WorldViewProjection", (const D3DXMATRIX*)&pcProj); + piEnd->SetMatrix("WorldViewProjection", (const D3DXMATRIX*)&pcProj2); UINT dwPasses = 0; piEnd->Begin(&dwPasses,0); @@ -2098,14 +2098,14 @@ int CDisplay::RenderPatternBG() { // seems we have not yet compiled this shader. // and NOW is the best time to do that ... - ID3DXBuffer* piBuffer = NULL; + ID3DXBuffer* piBuffer = nullptr; if(FAILED( D3DXCreateEffect(g_piDevice, g_szCheckerBackgroundShader.c_str(), (UINT)g_szCheckerBackgroundShader.length(), - NULL, - NULL, + nullptr, + nullptr, D3DXSHADER_USE_LEGACY_D3DX9_31_DLL, - NULL, + nullptr, &g_piPatternEffect,&piBuffer))) { if( piBuffer) @@ -2118,7 +2118,7 @@ int CDisplay::RenderPatternBG() if( piBuffer) { piBuffer->Release(); - piBuffer = NULL; + piBuffer = nullptr; } } else @@ -2126,14 +2126,14 @@ int CDisplay::RenderPatternBG() // clear the color buffer in magenta // (hopefully this is ugly enough that every ps_2_0 cards owner // runs to the next shop to buy himself a new card ...) - g_piDevice->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, + g_piDevice->Clear(0,nullptr,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0xFF,0xFF,0,0xFF), 1.0f,0 ); return 1; } } // clear the depth buffer only - g_piDevice->Clear(0,NULL,D3DCLEAR_ZBUFFER, + g_piDevice->Clear(0,nullptr,D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0xFF,0xFF,0,0xFF), 1.0f,0 ); // setup the colors to be used ... diff --git a/tools/assimp_view/HelpDialog.cpp b/tools/assimp_view/HelpDialog.cpp index 70b2ac866..d1f34cbf5 100644 --- a/tools/assimp_view/HelpDialog.cpp +++ b/tools/assimp_view/HelpDialog.cpp @@ -53,8 +53,8 @@ INT_PTR CALLBACK HelpDialogProc(HWND hwndDlg,UINT uMsg, WPARAM wParam,LPARAM ) { case WM_INITDIALOG: { // load the help file ... - HRSRC res = FindResource(NULL,MAKEINTRESOURCE(IDR_TEXT1),"TEXT"); - HGLOBAL hg = LoadResource(NULL,res); + HRSRC res = FindResource(nullptr,MAKEINTRESOURCE(IDR_TEXT1),"TEXT"); + HGLOBAL hg = LoadResource(nullptr,res); void* pData = LockResource(hg); SETTEXTEX sInfo; diff --git a/tools/assimp_view/LogDisplay.cpp b/tools/assimp_view/LogDisplay.cpp index ff5ed8680..9f71fbae7 100644 --- a/tools/assimp_view/LogDisplay.cpp +++ b/tools/assimp_view/LogDisplay.cpp @@ -117,29 +117,29 @@ void CLogDisplay::OnRender() { sCopy.top = sWndRect.top+1; sCopy.bottom = sWndRect.bottom+1; sCopy.right = sWndRect.right+1; - this->piFont->DrawText(NULL,szText , + this->piFont->DrawText(nullptr,szText , -1,&sCopy,DT_CENTER | DT_VCENTER,D3DCOLOR_ARGB(100,0x0,0x0,0x0)); sCopy.left = sWndRect.left+1; sCopy.top = sWndRect.top+1; sCopy.bottom = sWndRect.bottom-1; sCopy.right = sWndRect.right-1; - this->piFont->DrawText(NULL,szText , + this->piFont->DrawText(nullptr,szText , -1,&sCopy,DT_CENTER | DT_VCENTER,D3DCOLOR_ARGB(100,0x0,0x0,0x0)); sCopy.left = sWndRect.left-1; sCopy.top = sWndRect.top-1; sCopy.bottom = sWndRect.bottom+1; sCopy.right = sWndRect.right+1; - this->piFont->DrawText(NULL,szText , + this->piFont->DrawText(nullptr,szText , -1,&sCopy,DT_CENTER | DT_VCENTER,D3DCOLOR_ARGB(100,0x0,0x0,0x0)); sCopy.left = sWndRect.left-1; sCopy.top = sWndRect.top-1; sCopy.bottom = sWndRect.bottom-1; sCopy.right = sWndRect.right-1; - this->piFont->DrawText(NULL,szText , + this->piFont->DrawText(nullptr,szText , -1,&sCopy,DT_CENTER | DT_VCENTER,D3DCOLOR_ARGB(100,0x0,0x0,0x0)); // text - this->piFont->DrawText(NULL,szText , + this->piFont->DrawText(nullptr,szText , -1,&sWndRect,DT_CENTER | DT_VCENTER,D3DCOLOR_ARGB(0xFF,0xFF,0xFF,0xFF)); } @@ -176,7 +176,7 @@ void CLogDisplay::OnRender() { sCopy.top = sRect.top+1; sCopy.bottom = sRect.bottom+1; sCopy.right = sRect.right+1; - this->piFont->DrawText(NULL,szText, + this->piFont->DrawText(nullptr,szText, -1,&sCopy,DT_RIGHT | DT_TOP,D3DCOLOR_ARGB( (unsigned char)(fAlpha * 100.0f),0x0,0x0,0x0)); @@ -184,7 +184,7 @@ void CLogDisplay::OnRender() { sCopy.top = sRect.top-1; sCopy.bottom = sRect.bottom-1; sCopy.right = sRect.right-1; - this->piFont->DrawText(NULL,szText, + this->piFont->DrawText(nullptr,szText, -1,&sCopy,DT_RIGHT | DT_TOP,D3DCOLOR_ARGB( (unsigned char)(fAlpha * 100.0f),0x0,0x0,0x0)); @@ -192,7 +192,7 @@ void CLogDisplay::OnRender() { sCopy.top = sRect.top-1; sCopy.bottom = sRect.bottom+1; sCopy.right = sRect.right+1; - this->piFont->DrawText(NULL,szText, + this->piFont->DrawText(nullptr,szText, -1,&sCopy,DT_RIGHT | DT_TOP,D3DCOLOR_ARGB( (unsigned char)(fAlpha * 100.0f),0x0,0x0,0x0)); @@ -200,12 +200,12 @@ void CLogDisplay::OnRender() { sCopy.top = sRect.top+1; sCopy.bottom = sRect.bottom-1; sCopy.right = sRect.right-1; - this->piFont->DrawText(NULL,szText, + this->piFont->DrawText(nullptr,szText, -1,&sCopy,DT_RIGHT | DT_TOP,D3DCOLOR_ARGB( (unsigned char)(fAlpha * 100.0f),0x0,0x0,0x0)); // draw the text itself - int iPX = this->piFont->DrawText(NULL,szText, + int iPX = this->piFont->DrawText(nullptr,szText, -1,&sRect,DT_RIGHT | DT_TOP,clrColor); sRect.top += iPX; diff --git a/tools/assimp_view/LogWindow.cpp b/tools/assimp_view/LogWindow.cpp index ff6e71038..13abd50f3 100644 --- a/tools/assimp_view/LogWindow.cpp +++ b/tools/assimp_view/LogWindow.cpp @@ -70,7 +70,7 @@ static const char* AI_VIEW_RTF_LOG_HEADER = // Message procedure for the log window //------------------------------------------------------------------------------- INT_PTR CALLBACK LogDialogProc(HWND hwndDlg,UINT uMsg, - WPARAM wParam,LPARAM lParam) + WPARAM /*wParam*/,LPARAM lParam) { (void)lParam; switch (uMsg) @@ -86,7 +86,7 @@ INT_PTR CALLBACK LogDialogProc(HWND hwndDlg,UINT uMsg, int x = LOWORD(lParam); int y = HIWORD(lParam); - SetWindowPos(GetDlgItem(hwndDlg,IDC_EDIT1),NULL,0,0, + SetWindowPos(GetDlgItem(hwndDlg,IDC_EDIT1),nullptr,0,0, x-10,y-12,SWP_NOMOVE|SWP_NOZORDER); return TRUE; @@ -103,7 +103,7 @@ INT_PTR CALLBACK LogDialogProc(HWND hwndDlg,UINT uMsg, //------------------------------------------------------------------------------- void CLogWindow::Init () { this->hwnd = ::CreateDialog(g_hInstance,MAKEINTRESOURCE(IDD_LOGVIEW), - NULL,&LogDialogProc); + nullptr,&LogDialogProc); if (!this->hwnd) { CLogDisplay::Instance().AddEntry("[ERROR] Unable to create logger window", @@ -156,7 +156,7 @@ void CLogWindow::Save() { char szFileName[MAX_PATH]; DWORD dwTemp = MAX_PATH; - if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"LogDestination",NULL,NULL,(BYTE*)szFileName,&dwTemp)) { + if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"LogDestination",nullptr,nullptr,(BYTE*)szFileName,&dwTemp)) { // Key was not found. Use C: strcpy(szFileName,""); } else { @@ -169,12 +169,12 @@ void CLogWindow::Save() { } OPENFILENAME sFilename1 = { sizeof(OPENFILENAME), - g_hDlg,GetModuleHandle(NULL), - "Log files\0*.txt", NULL, 0, 1, - szFileName, MAX_PATH, NULL, 0, NULL, + g_hDlg,GetModuleHandle(nullptr), + "Log files\0*.txt", nullptr, 0, 1, + szFileName, MAX_PATH, nullptr, 0, nullptr, "Save log to file", OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_NOCHANGEDIR, - 0, 1, ".txt", 0, NULL, NULL + 0, 1, ".txt", 0, nullptr, nullptr }; if(GetSaveFileName(&sFilename1) == 0) return; diff --git a/tools/assimp_view/Material.cpp b/tools/assimp_view/Material.cpp index 0d504e9fb..b2e363e4c 100644 --- a/tools/assimp_view/Material.cpp +++ b/tools/assimp_view/Material.cpp @@ -210,15 +210,15 @@ int CMaterialManager::SetDefaultTexture(IDirect3DTexture9** p_ppiOut) D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, p_ppiOut, - NULL))) + nullptr))) { CLogDisplay::Instance().AddEntry("[ERROR] Unable to create default texture", D3DCOLOR_ARGB(0xFF,0xFF,0,0)); - *p_ppiOut = NULL; + *p_ppiOut = nullptr; return 0; } - D3DXFillTexture(*p_ppiOut,&FillFunc,NULL); + D3DXFillTexture(*p_ppiOut,&FillFunc,nullptr); sDefaultTexture = *p_ppiOut; sDefaultTexture->AddRef(); @@ -287,7 +287,7 @@ bool CMaterialManager::TryLongerPath(char* szTemp,aiString* p_szString) size_t iLen2 = iLen+1; iLen2 = iLen2 > MAXLEN ? MAXLEN : iLen2; memcpy(p_szString->data,szTempB,iLen2); - p_szString->length = iLen; + p_szString->length = static_cast(iLen); return true; } } @@ -301,7 +301,7 @@ bool CMaterialManager::TryLongerPath(char* szTemp,aiString* p_szString) size_t iLen2 = iLen+1; iLen2 = iLen2 > MAXLEN ? MAXLEN : iLen2; memcpy(p_szString->data,szTempB,iLen2); - p_szString->length = iLen; + p_szString->length = static_cast(iLen); return true; } } @@ -316,7 +316,7 @@ bool CMaterialManager::TryLongerPath(char* szTemp,aiString* p_szString) //------------------------------------------------------------------------------- int CMaterialManager::FindValidPath(aiString* p_szString) { - ai_assert(NULL != p_szString); + ai_assert(nullptr != p_szString); aiString pcpy = *p_szString; if ('*' == p_szString->data[0]) { // '*' as first character indicates an embedded file @@ -389,10 +389,10 @@ int CMaterialManager::FindValidPath(aiString* p_szString) if( !q ) q=strrchr( tmp2,'\\' ); if( q ){ strcpy( q+1,p+1 ); - if((pFile=fopen( tmp2,"r" ))){ + if((pFile=fopen( tmp2,"r" )) != nullptr){ fclose( pFile ); strcpy(p_szString->data,tmp2); - p_szString->length = strlen(tmp2); + p_szString->length = static_cast(strlen(tmp2)); return 1; } } @@ -402,23 +402,22 @@ int CMaterialManager::FindValidPath(aiString* p_szString) } fclose(pFile); - // copy the result string back to the aiString - const size_t iLen = strlen(szTemp); - size_t iLen2 = iLen+1; - iLen2 = iLen2 > MAXLEN ? MAXLEN : iLen2; - memcpy(p_szString->data,szTemp,iLen2); - p_szString->length = iLen; - + // copy the result string back to the aiStr + const size_t len = strlen(szTemp); + size_t len2 = len+1; + len2 = len2 > MAXLEN ? MAXLEN : len2; + memcpy(p_szString->data, szTemp, len2); + p_szString->length = static_cast(len); } return 1; } //------------------------------------------------------------------------------- int CMaterialManager::LoadTexture(IDirect3DTexture9** p_ppiOut,aiString* szPath) { - ai_assert(NULL != p_ppiOut); - ai_assert(NULL != szPath); + ai_assert(nullptr != p_ppiOut); + ai_assert(nullptr != szPath); - *p_ppiOut = NULL; + *p_ppiOut = nullptr; const std::string s = szPath->data; TextureCache::iterator ff; @@ -453,7 +452,7 @@ int CMaterialManager::LoadTexture(IDirect3DTexture9** p_ppiOut,aiString* szPath) D3DX_DEFAULT, 0, &info, - NULL, + nullptr, p_ppiOut))) { std::string sz = "[ERROR] Unable to load embedded texture (#1): "; @@ -470,7 +469,7 @@ int CMaterialManager::LoadTexture(IDirect3DTexture9** p_ppiOut,aiString* szPath) if(FAILED(g_piDevice->CreateTexture( g_pcAsset->pcScene->mTextures[iIndex]->mWidth, g_pcAsset->pcScene->mTextures[iIndex]->mHeight, - 0,D3DUSAGE_AUTOGENMIPMAP,D3DFMT_A8R8G8B8,D3DPOOL_MANAGED,p_ppiOut,NULL))) + 0,D3DUSAGE_AUTOGENMIPMAP,D3DFMT_A8R8G8B8,D3DPOOL_MANAGED,p_ppiOut,nullptr))) { std::string sz = "[ERROR] Unable to load embedded texture (#2): "; sz.append(szPath->data); @@ -482,7 +481,7 @@ int CMaterialManager::LoadTexture(IDirect3DTexture9** p_ppiOut,aiString* szPath) // now copy the data to it ... (assume non pow2 to be supported) D3DLOCKED_RECT sLock; - (*p_ppiOut)->LockRect(0,&sLock,NULL,0); + (*p_ppiOut)->LockRect(0,&sLock,nullptr,0); const aiTexel* pcData = g_pcAsset->pcScene->mTextures[iIndex]->pcData; @@ -524,8 +523,8 @@ int CMaterialManager::LoadTexture(IDirect3DTexture9** p_ppiOut,aiString* szPath) D3DX_DEFAULT, D3DX_DEFAULT, 0, - NULL, - NULL, + nullptr, + nullptr, p_ppiOut))) { // error ... use the default texture instead @@ -550,44 +549,44 @@ void CMaterialManager::DeleteMaterial(AssetHelper::MeshHelper* pcIn) if (pcIn->piDiffuseTexture) { pcIn->piDiffuseTexture->Release(); - pcIn->piDiffuseTexture = NULL; + pcIn->piDiffuseTexture = nullptr; } if (pcIn->piSpecularTexture) { pcIn->piSpecularTexture->Release(); - pcIn->piSpecularTexture = NULL; + pcIn->piSpecularTexture = nullptr; } if (pcIn->piEmissiveTexture) { pcIn->piEmissiveTexture->Release(); - pcIn->piEmissiveTexture = NULL; + pcIn->piEmissiveTexture = nullptr; } if (pcIn->piAmbientTexture) { pcIn->piAmbientTexture->Release(); - pcIn->piAmbientTexture = NULL; + pcIn->piAmbientTexture = nullptr; } if (pcIn->piOpacityTexture) { pcIn->piOpacityTexture->Release(); - pcIn->piOpacityTexture = NULL; + pcIn->piOpacityTexture = nullptr; } if (pcIn->piNormalTexture) { pcIn->piNormalTexture->Release(); - pcIn->piNormalTexture = NULL; + pcIn->piNormalTexture = nullptr; } if (pcIn->piShininessTexture) { pcIn->piShininessTexture->Release(); - pcIn->piShininessTexture = NULL; + pcIn->piShininessTexture = nullptr; } if (pcIn->piLightmapTexture) { pcIn->piLightmapTexture->Release(); - pcIn->piLightmapTexture = NULL; + pcIn->piLightmapTexture = nullptr; } - pcIn->piEffect = NULL; + pcIn->piEffect = nullptr; } //------------------------------------------------------------------------------- void CMaterialManager::HMtoNMIfNecessary( @@ -595,8 +594,8 @@ void CMaterialManager::HMtoNMIfNecessary( IDirect3DTexture9** piTextureOut, bool bWasOriginallyHM) { - ai_assert(NULL != piTexture); - ai_assert(NULL != piTextureOut); + ai_assert(nullptr != piTexture); + ai_assert(nullptr != piTextureOut); bool bMustConvert = false; uintptr_t iElement = 3; @@ -617,7 +616,7 @@ void CMaterialManager::HMtoNMIfNecessary( D3DLOCKED_RECT sRect; D3DSURFACE_DESC sDesc; piTexture->GetLevelDesc(0,&sDesc); - if (FAILED(piTexture->LockRect(0,&sRect,NULL,D3DLOCK_READONLY))) + if (FAILED(piTexture->LockRect(0,&sRect,nullptr,D3DLOCK_READONLY))) { return; } @@ -627,7 +626,7 @@ void CMaterialManager::HMtoNMIfNecessary( { union { - struct {unsigned char b,g,r,a;}; + struct {unsigned char b,g,r,a;} data; char _array[4]; }; }; @@ -646,7 +645,7 @@ void CMaterialManager::HMtoNMIfNecessary( { for (unsigned int x = 0; x < sDesc.Width;++x) { - if (pcPointer->b != pcPointer->r || pcPointer->b != pcPointer->g) + if (pcPointer->data.b != pcPointer->data.r || pcPointer->data.b != pcPointer->data.g) { bIsEqual = false; break; @@ -705,9 +704,9 @@ void CMaterialManager::HMtoNMIfNecessary( aiColor3D clrColorLine; for (unsigned int x = 0; x < sDesc.Width;++x) { - clrColorLine.r += pcPointer->r; - clrColorLine.g += pcPointer->g; - clrColorLine.b += pcPointer->b; + clrColorLine.r += pcPointer->data.r; + clrColorLine.g += pcPointer->data.g; + clrColorLine.b += pcPointer->data.b; pcPointer++; } clrColor.r += clrColorLine.r /= (float)sDesc.Width; @@ -739,17 +738,17 @@ void CMaterialManager::HMtoNMIfNecessary( // need to convert it NOW if (bMustConvert) { - D3DSURFACE_DESC sDesc; - piTexture->GetLevelDesc(0, &sDesc); + D3DSURFACE_DESC sDesc2; + piTexture->GetLevelDesc(0, &sDesc2); IDirect3DTexture9* piTempTexture; if(FAILED(g_piDevice->CreateTexture( - sDesc.Width, - sDesc.Height, + sDesc2.Width, + sDesc2.Height, piTexture->GetLevelCount(), - sDesc.Usage, - sDesc.Format, - sDesc.Pool, &piTempTexture, NULL))) + sDesc2.Usage, + sDesc2.Format, + sDesc2.Pool, &piTempTexture, nullptr))) { CLogDisplay::Instance().AddEntry( "[ERROR] Unable to create normal map texture", @@ -764,7 +763,7 @@ void CMaterialManager::HMtoNMIfNecessary( else /*if (0 == iElement)*/dwFlags = D3DX_CHANNEL_BLUE; if(FAILED(D3DXComputeNormalMap(piTempTexture, - piTexture,NULL,0,dwFlags,1.0f))) + piTexture,nullptr,0,dwFlags,1.0f))) { CLogDisplay::Instance().AddEntry( "[ERROR] Unable to compute normal map from height map", @@ -780,12 +779,12 @@ void CMaterialManager::HMtoNMIfNecessary( //------------------------------------------------------------------------------- bool CMaterialManager::HasAlphaPixels(IDirect3DTexture9* piTexture) { - ai_assert(NULL != piTexture); + ai_assert(nullptr != piTexture); D3DLOCKED_RECT sRect; D3DSURFACE_DESC sDesc; piTexture->GetLevelDesc(0,&sDesc); - if (FAILED(piTexture->LockRect(0,&sRect,NULL,D3DLOCK_READONLY))) + if (FAILED(piTexture->LockRect(0,&sRect,nullptr,D3DLOCK_READONLY))) { return false; } @@ -823,8 +822,8 @@ bool CMaterialManager::HasAlphaPixels(IDirect3DTexture9* piTexture) int CMaterialManager::CreateMaterial( AssetHelper::MeshHelper* pcMesh,const aiMesh* pcSource) { - ai_assert(NULL != pcMesh); - ai_assert(NULL != pcSource); + ai_assert(nullptr != pcMesh); + ai_assert(nullptr != pcSource); ID3DXBuffer* piBuffer; @@ -1060,29 +1059,29 @@ int CMaterialManager::CreateMaterial( } AssetHelper::MeshHelper* pc = g_pcAsset->apcMeshes[i]; - if ((pcMesh->piDiffuseTexture != NULL ? true : false) != - (pc->piDiffuseTexture != NULL ? true : false)) + if ((pcMesh->piDiffuseTexture != nullptr ? true : false) != + (pc->piDiffuseTexture != nullptr ? true : false)) continue; - if ((pcMesh->piSpecularTexture != NULL ? true : false) != - (pc->piSpecularTexture != NULL ? true : false)) + if ((pcMesh->piSpecularTexture != nullptr ? true : false) != + (pc->piSpecularTexture != nullptr ? true : false)) continue; - if ((pcMesh->piAmbientTexture != NULL ? true : false) != - (pc->piAmbientTexture != NULL ? true : false)) + if ((pcMesh->piAmbientTexture != nullptr ? true : false) != + (pc->piAmbientTexture != nullptr ? true : false)) continue; - if ((pcMesh->piEmissiveTexture != NULL ? true : false) != - (pc->piEmissiveTexture != NULL ? true : false)) + if ((pcMesh->piEmissiveTexture != nullptr ? true : false) != + (pc->piEmissiveTexture != nullptr ? true : false)) continue; - if ((pcMesh->piNormalTexture != NULL ? true : false) != - (pc->piNormalTexture != NULL ? true : false)) + if ((pcMesh->piNormalTexture != nullptr ? true : false) != + (pc->piNormalTexture != nullptr ? true : false)) continue; - if ((pcMesh->piOpacityTexture != NULL ? true : false) != - (pc->piOpacityTexture != NULL ? true : false)) + if ((pcMesh->piOpacityTexture != nullptr ? true : false) != + (pc->piOpacityTexture != nullptr ? true : false)) continue; - if ((pcMesh->piShininessTexture != NULL ? true : false) != - (pc->piShininessTexture != NULL ? true : false)) + if ((pcMesh->piShininessTexture != nullptr ? true : false) != + (pc->piShininessTexture != nullptr ? true : false)) continue; - if ((pcMesh->piLightmapTexture != NULL ? true : false) != - (pc->piLightmapTexture != NULL ? true : false)) + if ((pcMesh->piLightmapTexture != nullptr ? true : false) != + (pc->piLightmapTexture != nullptr ? true : false)) continue; if ((pcMesh->eShadingMode != aiShadingMode_Gouraud ? true : false) != (pc->eShadingMode != aiShadingMode_Gouraud ? true : false)) @@ -1239,13 +1238,13 @@ int CMaterialManager::CreateMaterial( sMacro[iCurrent].Definition = "1"; ++iCurrent; } - sMacro[iCurrent].Name = NULL; - sMacro[iCurrent].Definition = NULL; + sMacro[iCurrent].Name = nullptr; + sMacro[iCurrent].Definition = nullptr; // compile the shader if(FAILED( D3DXCreateEffect(g_piDevice, g_szMaterialShader.c_str(),(UINT)g_szMaterialShader.length(), - (const D3DXMACRO*)sMacro,NULL,0,NULL,&pcMesh->piEffect,&piBuffer))) + (const D3DXMACRO*)sMacro,nullptr,0,nullptr,&pcMesh->piEffect,&piBuffer))) { // failed to compile the shader if( piBuffer) @@ -1333,7 +1332,7 @@ int CMaterialManager::SetupMaterial ( const aiMatrix4x4& pcCam, const aiVector3D& vPos) { - ai_assert(NULL != pcMesh); + ai_assert(nullptr != pcMesh); if (!pcMesh->piEffect)return 0; ID3DXEffect* piEnd = pcMesh->piEffect; @@ -1476,7 +1475,7 @@ int CMaterialManager::SetupMaterial ( //------------------------------------------------------------------------------- int CMaterialManager::EndMaterial (AssetHelper::MeshHelper* pcMesh) { - ai_assert(NULL != pcMesh); + ai_assert(nullptr != pcMesh); if (!pcMesh->piEffect)return 0; // end the effect @@ -1490,4 +1489,5 @@ int CMaterialManager::EndMaterial (AssetHelper::MeshHelper* pcMesh) return 1; } -}; // end namespace AssimpView + +} // end namespace AssimpView diff --git a/tools/assimp_view/MessageProc.cpp b/tools/assimp_view/MessageProc.cpp index 3000e557b..80589e647 100644 --- a/tools/assimp_view/MessageProc.cpp +++ b/tools/assimp_view/MessageProc.cpp @@ -60,13 +60,13 @@ using namespace Assimp; COLORREF g_aclCustomColors[16] = {0}; // Global registry key -HKEY g_hRegistry = NULL; +HKEY g_hRegistry = nullptr; // list of previous files (always 5) std::vector g_aPreviousFiles; // history menu item -HMENU g_hHistoryMenu = NULL; +HMENU g_hHistoryMenu = nullptr; float g_fACMR = 3.0f; @@ -89,10 +89,10 @@ void MakeFileAssociations() { char szTemp2[MAX_PATH]; char szTemp[MAX_PATH + 10]; - GetModuleFileName(NULL,szTemp2,MAX_PATH); + GetModuleFileName(nullptr,szTemp2,MAX_PATH); sprintf(szTemp,"%s %%1",szTemp2); - HKEY hRegistry = NULL; + HKEY hRegistry = nullptr; aiString list, tmp; aiGetExtensionList(&list); @@ -104,15 +104,15 @@ void MakeFileAssociations() { ai_assert(sz[0] == '*'); sprintf(buf,"Software\\Classes\\%s",sz+1); - RegCreateKeyEx(HKEY_CURRENT_USER,buf,0,NULL,0,KEY_ALL_ACCESS, NULL, &hRegistry,NULL); + RegCreateKeyEx(HKEY_CURRENT_USER,buf,0,nullptr,0,KEY_ALL_ACCESS, nullptr, &hRegistry,nullptr); RegSetValueEx(hRegistry,"",0,REG_SZ,(const BYTE*)"ASSIMPVIEW_CLASS",(DWORD)strlen("ASSIMPVIEW_CLASS")+1); RegCloseKey(hRegistry); - } while ((sz = strtok(NULL,";"))); + } while ((sz = strtok(nullptr,";")) != nullptr); - RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\ASSIMPVIEW_CLASS",0,NULL,0,KEY_ALL_ACCESS, NULL, &hRegistry,NULL); + RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\ASSIMPVIEW_CLASS",0,nullptr,0,KEY_ALL_ACCESS, nullptr, &hRegistry,nullptr); RegCloseKey(hRegistry); - RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\ASSIMPVIEW_CLASS\\shell\\open\\command",0,NULL,0,KEY_ALL_ACCESS, NULL, &hRegistry,NULL); + RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\ASSIMPVIEW_CLASS\\shell\\open\\command",0,nullptr,0,KEY_ALL_ACCESS, nullptr, &hRegistry,nullptr); RegSetValueEx(hRegistry,"",0,REG_SZ,(const BYTE*)szTemp,(DWORD)strlen(szTemp)+1); RegCloseKey(hRegistry); @@ -157,9 +157,9 @@ void HandleCommandLine(char* p_szCommand) { //------------------------------------------------------------------------------- void LoadLightColors() { DWORD dwTemp = 4; - RegQueryValueEx(g_hRegistry,"LightColor0",NULL,NULL, (BYTE*)&g_avLightColors[0],&dwTemp); - RegQueryValueEx(g_hRegistry,"LightColor1",NULL,NULL, (BYTE*)&g_avLightColors[1],&dwTemp); - RegQueryValueEx(g_hRegistry,"LightColor2",NULL,NULL, (BYTE*)&g_avLightColors[2],&dwTemp); + RegQueryValueEx(g_hRegistry,"LightColor0",nullptr,nullptr, (BYTE*)&g_avLightColors[0],&dwTemp); + RegQueryValueEx(g_hRegistry,"LightColor1",nullptr,nullptr, (BYTE*)&g_avLightColors[1],&dwTemp); + RegQueryValueEx(g_hRegistry,"LightColor2",nullptr,nullptr, (BYTE*)&g_avLightColors[2],&dwTemp); } //------------------------------------------------------------------------------- @@ -190,10 +190,10 @@ void SaveCheckerPatternColors() { //------------------------------------------------------------------------------- void LoadCheckerPatternColors() { DWORD dwTemp = sizeof(D3DXVECTOR3); - RegQueryValueEx(g_hRegistry,"CheckerPattern0",NULL,NULL, + RegQueryValueEx(g_hRegistry,"CheckerPattern0",nullptr,nullptr, (BYTE*) /* jep, this is evil */ CDisplay::Instance().GetFirstCheckerColor(),&dwTemp); - RegQueryValueEx(g_hRegistry,"CheckerPattern1",NULL,NULL, + RegQueryValueEx(g_hRegistry,"CheckerPattern1",nullptr,nullptr, (BYTE*) /* jep, this is evil */ CDisplay::Instance().GetSecondCheckerColor(),&dwTemp); } @@ -372,13 +372,13 @@ void ToggleUIState() { sRect2.top -= sRect.top; if (BST_UNCHECKED == IsDlgButtonChecked(g_hDlg,IDC_BLUBB)) { - SetWindowPos(g_hDlg,NULL,0,0,sRect.right-214,sRect.bottom, + SetWindowPos(g_hDlg,nullptr,0,0,sRect.right-214,sRect.bottom, SWP_NOMOVE | SWP_NOZORDER); SetWindowText(GetDlgItem(g_hDlg,IDC_BLUBB),">>"); storeRegKey(false, "MultiSampling"); } else { - SetWindowPos(g_hDlg,NULL,0,0,sRect.right+214,sRect.bottom, + SetWindowPos(g_hDlg,nullptr,0,0,sRect.right+214,sRect.bottom, SWP_NOMOVE | SWP_NOZORDER); storeRegKey(true, "LastUIState"); @@ -394,7 +394,7 @@ void LoadBGTexture() { char szFileName[MAX_PATH]; DWORD dwTemp = MAX_PATH; - if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"TextureSrc",NULL,NULL, (BYTE*)szFileName,&dwTemp)) { + if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"TextureSrc",nullptr,nullptr, (BYTE*)szFileName,&dwTemp)) { // Key was not found. Use C: strcpy(szFileName,""); } else { @@ -407,13 +407,13 @@ void LoadBGTexture() { } OPENFILENAME sFilename1 = { sizeof(OPENFILENAME), - g_hDlg,GetModuleHandle(NULL), + g_hDlg,GetModuleHandle(nullptr), "Textures\0*.png;*.dds;*.tga;*.bmp;*.tif;*.ppm;*.ppx;*.jpg;*.jpeg;*.exr\0*.*\0", - NULL, 0, 1, - szFileName, MAX_PATH, NULL, 0, NULL, + nullptr, 0, 1, + szFileName, MAX_PATH, nullptr, 0, nullptr, "Open texture as background", OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_NOCHANGEDIR, - 0, 1, ".jpg", 0, NULL, NULL + 0, 1, ".jpg", 0, nullptr, nullptr }; if(GetOpenFileName(&sFilename1) == 0) return; @@ -448,8 +448,8 @@ void DisplayColorDialog(D3DCOLOR* pclrResult) { clr.Flags = CC_RGBINIT | CC_FULLOPEN; clr.rgbResult = RGB((*pclrResult >> 16) & 0xff,(*pclrResult >> 8) & 0xff,*pclrResult & 0xff); clr.lpCustColors = g_aclCustomColors; - clr.lpfnHook = NULL; - clr.lpTemplateName = NULL; + clr.lpfnHook = nullptr; + clr.lpTemplateName = nullptr; clr.lCustData = 0; ChooseColor(&clr); @@ -472,8 +472,8 @@ void DisplayColorDialog(D3DXVECTOR4* pclrResult) { clamp(pclrResult->y * 255.0f), clamp(pclrResult->z * 255.0f)); clr.lpCustColors = g_aclCustomColors; - clr.lpfnHook = NULL; - clr.lpTemplateName = NULL; + clr.lpfnHook = nullptr; + clr.lpTemplateName = nullptr; clr.lCustData = 0; ChooseColor(&clr); @@ -504,7 +504,7 @@ void LoadSkybox() { char szFileName[MAX_PATH]; DWORD dwTemp = MAX_PATH; - if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"SkyBoxSrc",NULL,NULL, + if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"SkyBoxSrc",nullptr,nullptr, (BYTE*)szFileName,&dwTemp)) { // Key was not found. Use C: @@ -521,12 +521,12 @@ void LoadSkybox() { } OPENFILENAME sFilename1 = { sizeof(OPENFILENAME), - g_hDlg,GetModuleHandle(NULL), - "Skyboxes\0*.dds\0*.*\0", NULL, 0, 1, - szFileName, MAX_PATH, NULL, 0, NULL, + g_hDlg,GetModuleHandle(nullptr), + "Skyboxes\0*.dds\0*.*\0", nullptr, 0, 1, + szFileName, MAX_PATH, nullptr, 0, nullptr, "Open skybox as background", OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_NOCHANGEDIR, - 0, 1, ".dds", 0, NULL, NULL + 0, 1, ".dds", 0, nullptr, nullptr }; if(GetOpenFileName(&sFilename1) == 0) return; @@ -555,7 +555,7 @@ void SaveScreenshot() { char szFileName[MAX_PATH]; DWORD dwTemp = MAX_PATH; - if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"ScreenShot",NULL,NULL, (BYTE*)szFileName,&dwTemp)) { + if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"ScreenShot",nullptr,nullptr, (BYTE*)szFileName,&dwTemp)) { // Key was not found. Use C: strcpy(szFileName,""); } else { @@ -568,21 +568,21 @@ void SaveScreenshot() { } OPENFILENAME sFilename1 = { sizeof(OPENFILENAME), - g_hDlg,GetModuleHandle(NULL), - "PNG Images\0*.png", NULL, 0, 1, - szFileName, MAX_PATH, NULL, 0, NULL, + g_hDlg,GetModuleHandle(nullptr), + "PNG Images\0*.png", nullptr, 0, 1, + szFileName, MAX_PATH, nullptr, 0, nullptr, "Save Screenshot to file", OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_NOCHANGEDIR, - 0, 1, ".png", 0, NULL, NULL + 0, 1, ".png", 0, nullptr, nullptr }; if(GetSaveFileName(&sFilename1) == 0) return; // Now store the file in the registry RegSetValueExA(g_hRegistry,"ScreenShot",0,REG_SZ,(const BYTE*)szFileName,MAX_PATH); - IDirect3DSurface9* pi = NULL; + IDirect3DSurface9* pi = nullptr; g_piDevice->GetRenderTarget(0,&pi); - if(!pi || FAILED(D3DXSaveSurfaceToFile(szFileName,D3DXIFF_PNG,pi,NULL,NULL))) { + if(!pi || FAILED(D3DXSaveSurfaceToFile(szFileName,D3DXIFF_PNG,pi,nullptr,nullptr))) { CLogDisplay::Instance().AddEntry("[ERROR] Unable to save screenshot", D3DCOLOR_ARGB(0xFF,0xFF,0,0)); } else { @@ -751,7 +751,7 @@ void LoadHistory() { DWORD dwTemp = MAX_PATH; szFileName[0] ='\0'; - if(ERROR_SUCCESS == RegQueryValueEx(g_hRegistry,szName,NULL,NULL, + if(ERROR_SUCCESS == RegQueryValueEx(g_hRegistry,szName,nullptr,nullptr, (BYTE*)szFileName,&dwTemp)) { g_aPreviousFiles[i] = std::string(szFileName); } @@ -826,7 +826,7 @@ void OpenAsset() { char szFileName[MAX_PATH]; DWORD dwTemp = MAX_PATH; - if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"CurrentApp",NULL,NULL, (BYTE*)szFileName,&dwTemp)) { + if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"CurrentApp",nullptr,nullptr, (BYTE*)szFileName,&dwTemp)) { // Key was not found. Use C: strcpy(szFileName,""); } else { @@ -856,15 +856,15 @@ void OpenAsset() { ZeroMemory(&sFilename1, sizeof(sFilename1)); sFilename1.lStructSize = sizeof(sFilename1); sFilename1.hwndOwner = g_hDlg; - sFilename1.hInstance = GetModuleHandle(NULL); + sFilename1.hInstance = GetModuleHandle(nullptr); sFilename1.lpstrFile = szFileName; sFilename1.lpstrFile[0] = '\0'; sFilename1.nMaxFile = sizeof(szList); sFilename1.lpstrFilter = szList; sFilename1.nFilterIndex = 1; - sFilename1.lpstrFileTitle = NULL; + sFilename1.lpstrFileTitle = nullptr; sFilename1.nMaxFileTitle = 0; - sFilename1.lpstrInitialDir = NULL; + sFilename1.lpstrInitialDir = nullptr; sFilename1.Flags = OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_NOCHANGEDIR; if (GetOpenFileName(&sFilename1) == 0) { return; @@ -942,7 +942,7 @@ void DoExport(size_t formatId) { char szFileName[MAX_PATH*2]; DWORD dwTemp = sizeof(szFileName); - if(ERROR_SUCCESS == RegQueryValueEx(g_hRegistry,"ModelExportDest",NULL,NULL,(BYTE*)szFileName, &dwTemp)) { + if(ERROR_SUCCESS == RegQueryValueEx(g_hRegistry,"ModelExportDest",nullptr,nullptr,(BYTE*)szFileName, &dwTemp)) { ai_assert(strlen(szFileName) <= MAX_PATH); // invent a nice default file name @@ -975,12 +975,12 @@ void DoExport(size_t formatId) { const std::string ext = "."+std::string(e->fileExtension); OPENFILENAME sFilename1 = { sizeof(OPENFILENAME), - g_hDlg,GetModuleHandle(NULL), - desc, NULL, 0, 1, - szFileName, MAX_PATH, NULL, 0, NULL, + g_hDlg,GetModuleHandle(nullptr), + desc, nullptr, 0, 1, + szFileName, MAX_PATH, nullptr, 0, nullptr, "Export asset", OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_NOCHANGEDIR, - 0, 1, ext.c_str(), 0, NULL, NULL + 0, 1, ext.c_str(), 0, nullptr, nullptr }; if(::GetSaveFileName(&sFilename1) == 0) { return; @@ -1036,9 +1036,9 @@ void InitUI() { // store the key in a global variable for later use RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\ASSIMP\\Viewer", - 0,NULL,0,KEY_ALL_ACCESS, NULL, &g_hRegistry,NULL); + 0,nullptr,0,KEY_ALL_ACCESS, nullptr, &g_hRegistry,nullptr); - if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"LastUIState",NULL,NULL, (BYTE*)&dwValue,&dwTemp)) { + if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"LastUIState",nullptr,nullptr, (BYTE*)&dwValue,&dwTemp)) { dwValue = 1; } if (0 == dwValue) { @@ -1054,7 +1054,7 @@ void InitUI() { sRect2.left -= sRect.left; sRect2.top -= sRect.top; - SetWindowPos(g_hDlg,NULL,0,0,sRect.right-214,sRect.bottom, + SetWindowPos(g_hDlg,nullptr,0,0,sRect.right-214,sRect.bottom, SWP_NOMOVE | SWP_NOZORDER); SetWindowText(GetDlgItem(g_hDlg,IDC_BLUBB),">>"); } else { @@ -1062,7 +1062,7 @@ void InitUI() { } // AutoRotate - if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"AutoRotate",NULL,NULL, + if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"AutoRotate",nullptr,nullptr, (BYTE*)&dwValue,&dwTemp))dwValue = 0; if (0 == dwValue) { g_sOptions.bRotate = false; @@ -1073,7 +1073,7 @@ void InitUI() { } // MultipleLights - if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"MultipleLights",NULL,NULL, + if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"MultipleLights",nullptr,nullptr, (BYTE*)&dwValue,&dwTemp))dwValue = 0; if (0 == dwValue) { g_sOptions.b3Lights = false; @@ -1084,7 +1084,7 @@ void InitUI() { } // Light rotate - if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"LightRotate",NULL,NULL, + if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"LightRotate",nullptr,nullptr, (BYTE*)&dwValue,&dwTemp))dwValue = 0; if (0 == dwValue) { g_sOptions.bLightRotate = false; @@ -1095,7 +1095,7 @@ void InitUI() { } // NoSpecular - if (ERROR_SUCCESS != RegQueryValueEx(g_hRegistry, "NoSpecular", NULL, NULL, (BYTE*)&dwValue, &dwTemp)) { + if (ERROR_SUCCESS != RegQueryValueEx(g_hRegistry, "NoSpecular", nullptr, nullptr, (BYTE*)&dwValue, &dwTemp)) { dwValue = 0; } if (0 == dwValue) { @@ -1107,7 +1107,7 @@ void InitUI() { } // LowQuality - if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"LowQuality",NULL,NULL, + if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"LowQuality",nullptr,nullptr, (BYTE*)&dwValue,&dwTemp))dwValue = 0; if (0 == dwValue) { g_sOptions.bLowQuality = false; @@ -1118,7 +1118,7 @@ void InitUI() { } // LowQuality - if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"NoTransparency",NULL,NULL, + if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"NoTransparency",nullptr,nullptr, (BYTE*)&dwValue,&dwTemp))dwValue = 0; if (0 == dwValue) { g_sOptions.bNoAlphaBlending = false; @@ -1129,7 +1129,7 @@ void InitUI() { } // DisplayNormals - if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"RenderNormals",NULL,NULL, + if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"RenderNormals",nullptr,nullptr, (BYTE*)&dwValue,&dwTemp))dwValue = 0; if (0 == dwValue) { g_sOptions.bRenderNormals = false; @@ -1140,7 +1140,7 @@ void InitUI() { } // NoMaterials - if (ERROR_SUCCESS != RegQueryValueEx(g_hRegistry, "RenderMats", NULL, NULL, + if (ERROR_SUCCESS != RegQueryValueEx(g_hRegistry, "RenderMats", nullptr, nullptr, (BYTE*)&dwValue, &dwTemp)) { dwValue = 1; } @@ -1153,7 +1153,7 @@ void InitUI() { } // MultiSampling - if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"MultiSampling",NULL,NULL, + if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"MultiSampling",nullptr,nullptr, (BYTE*)&dwValue,&dwTemp))dwValue = 1; if (0 == dwValue) { @@ -1165,7 +1165,7 @@ void InitUI() { } // FPS Mode - if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"FPSView",NULL,NULL, + if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"FPSView",nullptr,nullptr, (BYTE*)&dwValue,&dwTemp))dwValue = 0; if (0 == dwValue) { g_bFPSView = false; @@ -1176,7 +1176,7 @@ void InitUI() { } // WireFrame - if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"Wireframe",NULL,NULL, + if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"Wireframe",nullptr,nullptr, (BYTE*)&dwValue,&dwTemp))dwValue = 0; if (0 == dwValue) { @@ -1189,7 +1189,7 @@ void InitUI() { CheckDlgButton(g_hDlg,IDC_TOGGLEWIRE,BST_CHECKED); } - if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"PostProcessing",NULL,NULL,(BYTE*)&dwValue,&dwTemp)) + if(ERROR_SUCCESS != RegQueryValueEx(g_hRegistry,"PostProcessing",nullptr,nullptr,(BYTE*)&dwValue,&dwTemp)) ppsteps = ppstepsdefault; else ppsteps = dwValue; @@ -1458,7 +1458,7 @@ INT_PTR CALLBACK MessageProc(HWND hwndDlg,UINT uMsg, WPARAM wParam,LPARAM lParam if (bDraw) { SetBkColor(pcStruct->hDC,RGB(0,0,0)); - MoveToEx(pcStruct->hDC,0,0,NULL); + MoveToEx(pcStruct->hDC,0,0,nullptr); LineTo(pcStruct->hDC,sRect.right-1,0); LineTo(pcStruct->hDC,sRect.right-1,sRect.bottom-1); LineTo(pcStruct->hDC,0,sRect.bottom-1); @@ -1534,7 +1534,7 @@ INT_PTR CALLBACK MessageProc(HWND hwndDlg,UINT uMsg, WPARAM wParam,LPARAM lParam g_eClick = EClickPos_Outside; if (xPos2 >= fHalfX && xPos2 < fHalfX + (int)sDesc.Width && yPos2 >= fHalfY && yPos2 < fHalfY + (int)sDesc.Height && - NULL != g_szImageMask) + nullptr != g_szImageMask) { // inside the texture. Lookup the grayscale value from it xPos2 -= fHalfX; @@ -1710,13 +1710,13 @@ INT_PTR CALLBACK MessageProc(HWND hwndDlg,UINT uMsg, WPARAM wParam,LPARAM lParam } else if (ID_TOOLS_LOGWINDOW == LOWORD(wParam)) { CLogWindow::Instance().Show(); } else if (ID__WEBSITE == LOWORD(wParam)) { - ShellExecute(NULL,"open","http://assimp.sourceforge.net","","",SW_SHOW); + ShellExecute(nullptr,"open","http://assimp.sourceforge.net","","",SW_SHOW); } else if (ID__WEBSITESF == LOWORD(wParam)) { - ShellExecute(NULL,"open","https://sourceforge.net/projects/assimp","","",SW_SHOW); + ShellExecute(nullptr,"open","https://sourceforge.net/projects/assimp","","",SW_SHOW); } else if (ID_REPORTBUG == LOWORD(wParam)) { - ShellExecute(NULL,"open","https://sourceforge.net/tracker/?func=add&group_id=226462&atid=1067632","","",SW_SHOW); + ShellExecute(nullptr,"open","https://sourceforge.net/tracker/?func=add&group_id=226462&atid=1067632","","",SW_SHOW); } else if (ID_FR == LOWORD(wParam)) { - ShellExecute(NULL,"open","https://sourceforge.net/forum/forum.php?forum_id=817653","","",SW_SHOW); + ShellExecute(nullptr,"open","https://sourceforge.net/forum/forum.php?forum_id=817653","","",SW_SHOW); } else if (ID_TOOLS_CLEARLOG == LOWORD(wParam)) { CLogWindow::Instance().Clear(); } else if (ID_TOOLS_SAVELOGTOFILE == LOWORD(wParam)) { @@ -1838,7 +1838,7 @@ INT_PTR CALLBACK MessageProc(HWND hwndDlg,UINT uMsg, WPARAM wParam,LPARAM lParam } else if (ID_IMPORTSETTINGS_OPENPOST == LOWORD(wParam)) { - ShellExecute(NULL,"open","http://assimp.sourceforge.net/lib_html/ai_post_process_8h.html","","",SW_SHOW); + ShellExecute(nullptr,"open","http://assimp.sourceforge.net/lib_html/ai_post_process_8h.html","","",SW_SHOW); } else if (ID_TOOLS_ORIGINALNORMALS == LOWORD(wParam)) { @@ -1922,7 +1922,7 @@ INT_PTR CALLBACK MessageProc(HWND hwndDlg,UINT uMsg, WPARAM wParam,LPARAM lParam DisplayColorDialog(&g_avLightColors[0]); SaveLightColors(); } - InvalidateRect(GetDlgItem(g_hDlg,IDC_LCOLOR1),NULL,TRUE); + InvalidateRect(GetDlgItem(g_hDlg,IDC_LCOLOR1),nullptr,TRUE); UpdateWindow(GetDlgItem(g_hDlg,IDC_LCOLOR1)); } else if (IDC_LCOLOR2 == LOWORD(wParam)) @@ -1939,13 +1939,13 @@ INT_PTR CALLBACK MessageProc(HWND hwndDlg,UINT uMsg, WPARAM wParam,LPARAM lParam DisplayColorDialog(&g_avLightColors[1]); SaveLightColors(); } - InvalidateRect(GetDlgItem(g_hDlg,IDC_LCOLOR2),NULL,TRUE); + InvalidateRect(GetDlgItem(g_hDlg,IDC_LCOLOR2),nullptr,TRUE); UpdateWindow(GetDlgItem(g_hDlg,IDC_LCOLOR2)); } else if (IDC_LCOLOR3 == LOWORD(wParam)) { DisplayColorDialog(&g_avLightColors[2]); - InvalidateRect(GetDlgItem(g_hDlg,IDC_LCOLOR3),NULL,TRUE); + InvalidateRect(GetDlgItem(g_hDlg,IDC_LCOLOR3),nullptr,TRUE); UpdateWindow(GetDlgItem(g_hDlg,IDC_LCOLOR3)); SaveLightColors(); } @@ -1966,11 +1966,11 @@ INT_PTR CALLBACK MessageProc(HWND hwndDlg,UINT uMsg, WPARAM wParam,LPARAM lParam SaveLightColors(); } - InvalidateRect(GetDlgItem(g_hDlg,IDC_LCOLOR1),NULL,TRUE); + InvalidateRect(GetDlgItem(g_hDlg,IDC_LCOLOR1),nullptr,TRUE); UpdateWindow(GetDlgItem(g_hDlg,IDC_LCOLOR1)); - InvalidateRect(GetDlgItem(g_hDlg,IDC_LCOLOR2),NULL,TRUE); + InvalidateRect(GetDlgItem(g_hDlg,IDC_LCOLOR2),nullptr,TRUE); UpdateWindow(GetDlgItem(g_hDlg,IDC_LCOLOR2)); - InvalidateRect(GetDlgItem(g_hDlg,IDC_LCOLOR3),NULL,TRUE); + InvalidateRect(GetDlgItem(g_hDlg,IDC_LCOLOR3),nullptr,TRUE); UpdateWindow(GetDlgItem(g_hDlg,IDC_LCOLOR3)); } else if (IDC_NOSPECULAR == LOWORD(wParam)) @@ -2076,7 +2076,7 @@ INT_PTR CALLBACK ProgressMessageProc(HWND hwndDlg,UINT uMsg, SendDlgItemMessage(hwndDlg,IDC_PROGRESS,PBM_SETRANGE,0, MAKELPARAM(0,500)); - SetTimer(hwndDlg,0,40,NULL); + SetTimer(hwndDlg,0,40,nullptr); return TRUE; case WM_CLOSE: @@ -2090,7 +2090,7 @@ INT_PTR CALLBACK ProgressMessageProc(HWND hwndDlg,UINT uMsg, #if 0 g_bLoadingCanceled = true; TerminateThread(g_hThreadHandle,5); - g_pcAsset = NULL; + g_pcAsset = nullptr; EndDialog(hwndDlg,0); #endif @@ -2167,14 +2167,14 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, // initialize the IDirect3D9 interface g_hInstance = hInstance; if (0 == InitD3D()) { - MessageBox(NULL,"Failed to initialize Direct3D 9", + MessageBox(nullptr,"Failed to initialize Direct3D 9", "ASSIMP ModelViewer",MB_OK); return -6; } // create the main dialog HWND hDlg = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOGMAIN), - NULL,&MessageProc); + nullptr,&MessageProc); // ensure we get high priority ::SetPriorityClass(GetCurrentProcess(),HIGH_PRIORITY_CLASS); @@ -2187,8 +2187,8 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, Assimp::DefaultLogger::Debugging | Assimp::DefaultLogger::Info | Assimp::DefaultLogger::Err | Assimp::DefaultLogger::Warn); - if (NULL == hDlg) { - MessageBox(NULL,"Failed to create dialog from resource", + if (nullptr == hDlg) { + MessageBox(nullptr,"Failed to create dialog from resource", "ASSIMP ModelViewer",MB_OK); return -5; } @@ -2202,7 +2202,7 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, // create the D3D device object if (0 == CreateDevice(g_sOptions.bMultiSample,false,true)) { - MessageBox(NULL,"Failed to initialize Direct3D 9 (2)", + MessageBox(nullptr,"Failed to initialize Direct3D 9 (2)", "ASSIMP ModelViewer",MB_OK); return -4; } @@ -2222,18 +2222,18 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, }; DWORD dwTemp = MAX_PATH; RegCreateKeyEx(HKEY_CURRENT_USER, - "Software\\ASSIMP\\Viewer",0,NULL,0,KEY_ALL_ACCESS, NULL, &hRegistry,NULL); - if(ERROR_SUCCESS == RegQueryValueEx(hRegistry,"LastSkyBoxSrc",NULL,NULL, + "Software\\ASSIMP\\Viewer",0,nullptr,0,KEY_ALL_ACCESS, nullptr, &hRegistry,nullptr); + if(ERROR_SUCCESS == RegQueryValueEx(hRegistry,"LastSkyBoxSrc",nullptr,nullptr, (BYTE*)szFileName,&dwTemp) && '\0' != szFileName[0]) { CBackgroundPainter::Instance().SetCubeMapBG(szFileName); } - else if(ERROR_SUCCESS == RegQueryValueEx(hRegistry,"LastTextureSrc",NULL,NULL, + else if(ERROR_SUCCESS == RegQueryValueEx(hRegistry,"LastTextureSrc",nullptr,nullptr, (BYTE*)szFileName,&dwTemp) && '\0' != szFileName[0]) { CBackgroundPainter::Instance().SetTextureBG(szFileName); } - else if(ERROR_SUCCESS == RegQueryValueEx(hRegistry,"Color",NULL,NULL, + else if(ERROR_SUCCESS == RegQueryValueEx(hRegistry,"Color",nullptr,nullptr, (BYTE*)&clrColor,&dwTemp)) { CBackgroundPainter::Instance().SetColor(clrColor); @@ -2251,7 +2251,7 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, double g_dLastTime = 0; while( uMsg.message != WM_QUIT ) { - if( PeekMessage( &uMsg, NULL, 0, 0, PM_REMOVE ) ) + if( PeekMessage( &uMsg, nullptr, 0, 0, PM_REMOVE ) ) { TranslateMessage( &uMsg ); DispatchMessage( &uMsg ); diff --git a/tools/assimp_view/assimp_view.cpp b/tools/assimp_view/assimp_view.cpp index b8f13b092..79a902b2a 100644 --- a/tools/assimp_view/assimp_view.cpp +++ b/tools/assimp_view/assimp_view.cpp @@ -61,17 +61,17 @@ extern std::string g_szDefaultShader; extern std::string g_szPassThroughShader; //------------------------------------------------------------------------------- -HINSTANCE g_hInstance = NULL; -HWND g_hDlg = NULL; -IDirect3D9* g_piD3D = NULL; -IDirect3DDevice9* g_piDevice = NULL; -IDirect3DVertexDeclaration9* gDefaultVertexDecl = NULL; +HINSTANCE g_hInstance = nullptr; +HWND g_hDlg = nullptr; +IDirect3D9* g_piD3D = nullptr; +IDirect3DDevice9* g_piDevice = nullptr; +IDirect3DVertexDeclaration9* gDefaultVertexDecl = nullptr; double g_fFPS = 0.0f; char g_szFileName[MAX_PATH]; -ID3DXEffect* g_piDefaultEffect = NULL; -ID3DXEffect* g_piNormalsEffect = NULL; -ID3DXEffect* g_piPassThroughEffect = NULL; -ID3DXEffect* g_piPatternEffect = NULL; +ID3DXEffect* g_piDefaultEffect = nullptr; +ID3DXEffect* g_piNormalsEffect = nullptr; +ID3DXEffect* g_piPassThroughEffect = nullptr; +ID3DXEffect* g_piPatternEffect = nullptr; bool g_bMousePressed = false; bool g_bMousePressedR = false; bool g_bMousePressedM = false; @@ -79,10 +79,10 @@ bool g_bMousePressedBoth = false; float g_fElpasedTime = 0.0f; D3DCAPS9 g_sCaps; bool g_bLoadingFinished = false; -HANDLE g_hThreadHandle = NULL; +HANDLE g_hThreadHandle = nullptr; float g_fWheelPos = -10.0f; bool g_bLoadingCanceled = false; -IDirect3DTexture9* g_pcTexture = NULL; +IDirect3DTexture9* g_pcTexture = nullptr; bool g_bPlay = false; double g_dCurrent = 0.; @@ -135,13 +135,13 @@ float g_fLightColor = 1.0f; RenderOptions g_sOptions; Camera g_sCamera; -AssetHelper *g_pcAsset = NULL; +AssetHelper *g_pcAsset = nullptr; // // Contains the mask image for the HUD // (used to determine the position of a click) // -unsigned char* g_szImageMask = NULL; +unsigned char* g_szImageMask = nullptr; float g_fLoadTime = 0.0f; @@ -175,7 +175,7 @@ DWORD WINAPI LoadThreadProc(LPVOID lpParameter) aiProcess_ConvertToLeftHanded | // convert everything to D3D left handed space aiProcess_SortByPType | // make 'clean' meshes which consist of a single typ of primitives 0, - NULL, + nullptr, props); aiReleasePropertyStore(props); @@ -186,7 +186,7 @@ DWORD WINAPI LoadThreadProc(LPVOID lpParameter) g_bLoadingFinished = true; // check whether the loading process has failed ... - if (NULL == g_pcAsset->pcScene) + if (nullptr == g_pcAsset->pcScene) { CLogDisplay::Instance().AddEntry("[ERROR] Unable to load this asset:", D3DCOLOR_ARGB(0xFF,0xFF,0,0)); @@ -223,7 +223,7 @@ int LoadAsset() DWORD dwID; g_bLoadingCanceled = false; g_pcAsset = new AssetHelper(); - g_hThreadHandle = CreateThread(NULL,0,&LoadThreadProc,NULL,0,&dwID); + g_hThreadHandle = CreateThread(nullptr,0,&LoadThreadProc,nullptr,0,&dwID); if (!g_hThreadHandle) { @@ -248,7 +248,7 @@ int LoadAsset() if (g_pcAsset) { delete g_pcAsset; - g_pcAsset = NULL; + g_pcAsset = nullptr; } return 0; } @@ -328,7 +328,7 @@ int DeleteAsset(void) { delete[] g_pcAsset->apcMeshes; delete g_pcAsset->mAnimator; delete g_pcAsset; - g_pcAsset = NULL; + g_pcAsset = nullptr; // reset the caption of the viewer window SetWindowText(g_hDlg,AI_VIEW_CAPTION_BASE); @@ -351,8 +351,8 @@ int DeleteAsset(void) { // piMatrix Transformation matrix of the graph at this position //------------------------------------------------------------------------------- int CalculateBounds(aiNode* piNode, aiVector3D* p_avOut, const aiMatrix4x4& piMatrix) { - ai_assert(NULL != piNode); - ai_assert(NULL != p_avOut); + ai_assert(nullptr != piNode); + ai_assert(nullptr != p_avOut); aiMatrix4x4 mTemp = piNode->mTransformation; mTemp.Transpose(); @@ -424,8 +424,8 @@ int ScaleAsset(void) //------------------------------------------------------------------------------- int GenerateNormalsAsLineList(AssetHelper::MeshHelper* pcMesh,const aiMesh* pcSource) { - ai_assert(NULL != pcMesh); - ai_assert(NULL != pcSource); + ai_assert(nullptr != pcMesh); + ai_assert(nullptr != pcSource); if (!pcSource->mNormals)return 0; @@ -434,7 +434,7 @@ int GenerateNormalsAsLineList(AssetHelper::MeshHelper* pcMesh,const aiMesh* pcSo pcSource->mNumVertices * 2, D3DUSAGE_WRITEONLY, AssetHelper::LineVertex::GetFVF(), - D3DPOOL_DEFAULT, &pcMesh->piVBNormals,NULL))) + D3DPOOL_DEFAULT, &pcMesh->piVBNormals,nullptr))) { CLogDisplay::Instance().AddEntry("Failed to create vertex buffer for the normal list", D3DCOLOR_ARGB(0xFF,0xFF,0,0)); @@ -495,7 +495,7 @@ int CreateAssetData() mesh->mNumVertices, D3DUSAGE_WRITEONLY, 0, - D3DPOOL_DEFAULT, &g_pcAsset->apcMeshes[i]->piVB,NULL))) { + D3DPOOL_DEFAULT, &g_pcAsset->apcMeshes[i]->piVB,nullptr))) { MessageBox(g_hDlg,"Failed to create vertex buffer", "ASSIMP Viewer Utility",MB_OK); return 2; @@ -505,7 +505,7 @@ int CreateAssetData() if (g_pcAsset->apcMeshes[i]->piOpacityTexture || 1.0f != g_pcAsset->apcMeshes[i]->fOpacity) dwUsage |= D3DUSAGE_DYNAMIC; - unsigned int nidx; + unsigned int nidx = 0; switch (mesh->mPrimitiveTypes) { case aiPrimitiveType_POINT: nidx = 1; @@ -534,7 +534,7 @@ int CreateAssetData() D3DFMT_INDEX32, D3DPOOL_DEFAULT, &g_pcAsset->apcMeshes[i]->piIB, - NULL))) + nullptr))) { MessageBox(g_hDlg,"Failed to create 32 Bit index buffer", "ASSIMP Viewer Utility",MB_OK); @@ -560,7 +560,7 @@ int CreateAssetData() D3DFMT_INDEX16, D3DPOOL_DEFAULT, &g_pcAsset->apcMeshes[i]->piIB, - NULL))) + nullptr))) { MessageBox(g_hDlg,"Failed to create 16 Bit index buffer", "ASSIMP Viewer Utility",MB_OK); @@ -595,11 +595,11 @@ int CreateAssetData() { pbData2->vPosition = mesh->mVertices[x]; - if (NULL == mesh->mNormals) + if (nullptr == mesh->mNormals) pbData2->vNormal = aiVector3D(0.0f,0.0f,0.0f); else pbData2->vNormal = mesh->mNormals[x]; - if (NULL == mesh->mTangents) { + if (nullptr == mesh->mTangents) { pbData2->vTangent = aiVector3D(0.0f,0.0f,0.0f); pbData2->vBitangent = aiVector3D(0.0f,0.0f,0.0f); } @@ -639,7 +639,7 @@ int CreateAssetData() ai_assert( weightsPerVertex[x].size() <= 4); for( unsigned int a = 0; a < weightsPerVertex[x].size(); a++) { - boneIndices[a] = weightsPerVertex[x][a].mVertexId; + boneIndices[a] = static_cast(weightsPerVertex[x][a].mVertexId); boneWeights[a] = (unsigned char) (weightsPerVertex[x][a].mWeight * 255.0f); } @@ -677,17 +677,17 @@ int DeleteAssetData(bool bNoMaterials) if(g_pcAsset->apcMeshes[i]->piVB) { g_pcAsset->apcMeshes[i]->piVB->Release(); - g_pcAsset->apcMeshes[i]->piVB = NULL; + g_pcAsset->apcMeshes[i]->piVB = nullptr; } if(g_pcAsset->apcMeshes[i]->piVBNormals) { g_pcAsset->apcMeshes[i]->piVBNormals->Release(); - g_pcAsset->apcMeshes[i]->piVBNormals = NULL; + g_pcAsset->apcMeshes[i]->piVBNormals = nullptr; } if(g_pcAsset->apcMeshes[i]->piIB) { g_pcAsset->apcMeshes[i]->piIB->Release(); - g_pcAsset->apcMeshes[i]->piIB = NULL; + g_pcAsset->apcMeshes[i]->piIB = nullptr; } // TODO ... unfixed memory leak @@ -703,42 +703,42 @@ int DeleteAssetData(bool bNoMaterials) if(g_pcAsset->apcMeshes[i]->piEffect) { g_pcAsset->apcMeshes[i]->piEffect->Release(); - g_pcAsset->apcMeshes[i]->piEffect = NULL; + g_pcAsset->apcMeshes[i]->piEffect = nullptr; } if(g_pcAsset->apcMeshes[i]->piDiffuseTexture) { g_pcAsset->apcMeshes[i]->piDiffuseTexture->Release(); - g_pcAsset->apcMeshes[i]->piDiffuseTexture = NULL; + g_pcAsset->apcMeshes[i]->piDiffuseTexture = nullptr; } if(g_pcAsset->apcMeshes[i]->piNormalTexture) { g_pcAsset->apcMeshes[i]->piNormalTexture->Release(); - g_pcAsset->apcMeshes[i]->piNormalTexture = NULL; + g_pcAsset->apcMeshes[i]->piNormalTexture = nullptr; } if(g_pcAsset->apcMeshes[i]->piSpecularTexture) { g_pcAsset->apcMeshes[i]->piSpecularTexture->Release(); - g_pcAsset->apcMeshes[i]->piSpecularTexture = NULL; + g_pcAsset->apcMeshes[i]->piSpecularTexture = nullptr; } if(g_pcAsset->apcMeshes[i]->piAmbientTexture) { g_pcAsset->apcMeshes[i]->piAmbientTexture->Release(); - g_pcAsset->apcMeshes[i]->piAmbientTexture = NULL; + g_pcAsset->apcMeshes[i]->piAmbientTexture = nullptr; } if(g_pcAsset->apcMeshes[i]->piEmissiveTexture) { g_pcAsset->apcMeshes[i]->piEmissiveTexture->Release(); - g_pcAsset->apcMeshes[i]->piEmissiveTexture = NULL; + g_pcAsset->apcMeshes[i]->piEmissiveTexture = nullptr; } if(g_pcAsset->apcMeshes[i]->piOpacityTexture) { g_pcAsset->apcMeshes[i]->piOpacityTexture->Release(); - g_pcAsset->apcMeshes[i]->piOpacityTexture = NULL; + g_pcAsset->apcMeshes[i]->piOpacityTexture = nullptr; } if(g_pcAsset->apcMeshes[i]->piShininessTexture) { g_pcAsset->apcMeshes[i]->piShininessTexture->Release(); - g_pcAsset->apcMeshes[i]->piShininessTexture = NULL; + g_pcAsset->apcMeshes[i]->piShininessTexture = nullptr; } } } @@ -776,10 +776,10 @@ int SetupFPSView() //------------------------------------------------------------------------------- int InitD3D(void) { - if (NULL == g_piD3D) + if (nullptr == g_piD3D) { g_piD3D = Direct3DCreate9(D3D_SDK_VERSION); - if (NULL == g_piD3D)return 0; + if (nullptr == g_piD3D)return 0; } return 1; } @@ -792,20 +792,20 @@ int InitD3D(void) int ShutdownD3D(void) { ShutdownDevice(); - if (NULL != g_piD3D) + if (nullptr != g_piD3D) { g_piD3D->Release(); - g_piD3D = NULL; + g_piD3D = nullptr; } return 1; } template inline -void SafeRelease(TComPtr *ptr) { - if (nullptr != g_piPassThroughEffect) { - g_piPassThroughEffect->Release(); - g_piPassThroughEffect = nullptr; +void SafeRelease(TComPtr *&ptr) { + if (nullptr != ptr) { + ptr->Release(); + ptr = nullptr; } } @@ -843,12 +843,12 @@ int ShutdownDevice(void) int CreateHUDTexture() { // lock the memory resource ourselves - HRSRC res = FindResource(NULL,MAKEINTRESOURCE(IDR_HUD),RT_RCDATA); - HGLOBAL hg = LoadResource(NULL,res); + HRSRC res = FindResource(nullptr,MAKEINTRESOURCE(IDR_HUD),RT_RCDATA); + HGLOBAL hg = LoadResource(nullptr,res); void* pData = LockResource(hg); if(FAILED(D3DXCreateTextureFromFileInMemoryEx(g_piDevice, - pData,SizeofResource(NULL,res), + pData,SizeofResource(nullptr,res), D3DX_DEFAULT_NONPOW2, D3DX_DEFAULT_NONPOW2, 1, @@ -858,15 +858,15 @@ int CreateHUDTexture() D3DX_DEFAULT, D3DX_DEFAULT, 0, - NULL, - NULL, + nullptr, + nullptr, &g_pcTexture))) { CLogDisplay::Instance().AddEntry("[ERROR] Unable to load HUD texture", D3DCOLOR_ARGB(0xFF,0xFF,0,0)); - g_pcTexture = NULL; - g_szImageMask = NULL; + g_pcTexture = nullptr; + g_szImageMask = nullptr; FreeResource(hg); return 0; @@ -879,13 +879,13 @@ int CreateHUDTexture() // lock the memory resource ourselves - res = FindResource(NULL,MAKEINTRESOURCE(IDR_HUDMASK),RT_RCDATA); - hg = LoadResource(NULL,res); + res = FindResource(nullptr,MAKEINTRESOURCE(IDR_HUDMASK),RT_RCDATA); + hg = LoadResource(nullptr,res); pData = LockResource(hg); IDirect3DTexture9* pcTex; if(FAILED(D3DXCreateTextureFromFileInMemoryEx(g_piDevice, - pData,SizeofResource(NULL,res), + pData,SizeofResource(nullptr,res), sDesc.Width, sDesc.Height, 1, @@ -895,13 +895,13 @@ int CreateHUDTexture() D3DX_DEFAULT, D3DX_DEFAULT, 0, - NULL, - NULL, + nullptr, + nullptr, &pcTex))) { CLogDisplay::Instance().AddEntry("[ERROR] Unable to load HUD mask texture", D3DCOLOR_ARGB(0xFF,0xFF,0,0)); - g_szImageMask = NULL; + g_szImageMask = nullptr; FreeResource(hg); return 0; @@ -911,7 +911,7 @@ int CreateHUDTexture() // lock the texture and copy it to get a pointer D3DLOCKED_RECT sRect; - pcTex->LockRect(0,&sRect,NULL,D3DLOCK_READONLY); + pcTex->LockRect(0,&sRect,nullptr,D3DLOCK_READONLY); unsigned char* szOut = new unsigned char[sDesc.Width * sDesc.Height]; unsigned char* _szOut = szOut; @@ -1023,14 +1023,14 @@ int CreateDevice (bool p_bMultiSample,bool p_bSuperSample,bool bHW /*= true*/) } // compile the default material shader (gray gouraud/phong) - ID3DXBuffer* piBuffer = NULL; + ID3DXBuffer* piBuffer = nullptr; if(FAILED( D3DXCreateEffect(g_piDevice, g_szDefaultShader.c_str(), (UINT)g_szDefaultShader.length(), - NULL, - NULL, + nullptr, + nullptr, AI_SHADER_COMPILE_FLAGS, - NULL, + nullptr, &g_piDefaultEffect,&piBuffer))) { if( piBuffer) @@ -1043,7 +1043,7 @@ int CreateDevice (bool p_bMultiSample,bool p_bSuperSample,bool bHW /*= true*/) if( piBuffer) { piBuffer->Release(); - piBuffer = NULL; + piBuffer = nullptr; } // use Fixed Function effect when working with shaderless cards @@ -1053,7 +1053,7 @@ int CreateDevice (bool p_bMultiSample,bool p_bSuperSample,bool bHW /*= true*/) // create the shader used to draw the HUD if(FAILED( D3DXCreateEffect(g_piDevice, g_szPassThroughShader.c_str(),(UINT)g_szPassThroughShader.length(), - NULL,NULL,AI_SHADER_COMPILE_FLAGS,NULL,&g_piPassThroughEffect,&piBuffer))) + nullptr,nullptr,AI_SHADER_COMPILE_FLAGS,nullptr,&g_piPassThroughEffect,&piBuffer))) { if( piBuffer) { @@ -1065,7 +1065,7 @@ int CreateDevice (bool p_bMultiSample,bool p_bSuperSample,bool bHW /*= true*/) if( piBuffer) { piBuffer->Release(); - piBuffer = NULL; + piBuffer = nullptr; } // use Fixed Function effect when working with shaderless cards @@ -1075,7 +1075,7 @@ int CreateDevice (bool p_bMultiSample,bool p_bSuperSample,bool bHW /*= true*/) // create the shader used to visualize normal vectors if(FAILED( D3DXCreateEffect(g_piDevice, g_szNormalsShader.c_str(),(UINT)g_szNormalsShader.length(), - NULL,NULL,AI_SHADER_COMPILE_FLAGS,NULL,&g_piNormalsEffect, &piBuffer))) + nullptr,nullptr,AI_SHADER_COMPILE_FLAGS,nullptr,&g_piNormalsEffect, &piBuffer))) { if( piBuffer) { @@ -1087,7 +1087,7 @@ int CreateDevice (bool p_bMultiSample,bool p_bSuperSample,bool bHW /*= true*/) if( piBuffer) { piBuffer->Release(); - piBuffer = NULL; + piBuffer = nullptr; } //MessageBox( g_hDlg, "Failed to create vertex declaration", "Init", MB_OK);