From 9d11b220eb4f19d823179bfe68ef89c81b1e1079 Mon Sep 17 00:00:00 2001 From: Oleg Ivanov Date: Sat, 6 Apr 2024 12:48:28 +0200 Subject: [PATCH 1/3] Fix utDefaultIOStream test under MinGW (#5525) --- test/unit/UnitTestFileGenerator.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/test/unit/UnitTestFileGenerator.h b/test/unit/UnitTestFileGenerator.h index 2166c6939..93007bad9 100644 --- a/test/unit/UnitTestFileGenerator.h +++ b/test/unit/UnitTestFileGenerator.h @@ -44,9 +44,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +#if defined(_MSC_VER) || defined(__MINGW64__) || defined(__MINGW32__) +#define TMP_PATH "./" +#elif defined(__GNUC__) || defined(__clang__) +#define TMP_PATH "/tmp/" +#endif + #if defined(_MSC_VER) #include -#define TMP_PATH "./" inline FILE* MakeTmpFile(char* tmplate) { auto pathtemplate = _mktemp(tmplate); @@ -60,7 +65,6 @@ inline FILE* MakeTmpFile(char* tmplate) return fs; } #elif defined(__GNUC__) || defined(__clang__) -#define TMP_PATH "/tmp/" inline FILE* MakeTmpFile(char* tmplate) { auto fd = mkstemp(tmplate); From 52c2b6896a22a892789bc98965beff3ef7547019 Mon Sep 17 00:00:00 2001 From: RoboSchmied Date: Sat, 6 Apr 2024 21:26:32 +0200 Subject: [PATCH 2/3] Fix 16 typos (#5518) Signed-off-by: RoboSchmied Co-authored-by: Kim Kulling --- code/AssetLib/HMP/HMPFileData.h | 2 +- code/AssetLib/MD2/MD2FileData.h | 2 +- code/AssetLib/MD3/MD3FileData.h | 2 +- code/AssetLib/MDC/MDCFileData.h | 2 +- code/AssetLib/MDL/MDLFileData.h | 2 +- doc/dox.h | 2 +- include/assimp/ByteSwapper.h | 8 ++++---- include/assimp/StreamReader.h | 6 +++--- include/assimp/StreamWriter.h | 6 +++--- 9 files changed, 16 insertions(+), 16 deletions(-) diff --git a/code/AssetLib/HMP/HMPFileData.h b/code/AssetLib/HMP/HMPFileData.h index 4fc54e2c8..5f6ca4f55 100644 --- a/code/AssetLib/HMP/HMPFileData.h +++ b/code/AssetLib/HMP/HMPFileData.h @@ -49,7 +49,7 @@ namespace HMP { #include #include -// to make it easier for us, we test the magic word against both "endianesses" +// to make it easier for us, we test the magic word against both "endiannesses" #define AI_HMP_MAGIC_NUMBER_BE_4 AI_MAKE_MAGIC("HMP4") #define AI_HMP_MAGIC_NUMBER_LE_4 AI_MAKE_MAGIC("4PMH") diff --git a/code/AssetLib/MD2/MD2FileData.h b/code/AssetLib/MD2/MD2FileData.h index 6c1f7069b..0dba71e56 100644 --- a/code/AssetLib/MD2/MD2FileData.h +++ b/code/AssetLib/MD2/MD2FileData.h @@ -55,7 +55,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace Assimp { namespace MD2 { -// to make it easier for us, we test the magic word against both "endianesses" +// to make it easier for us, we test the magic word against both "endiannesses" #define AI_MD2_MAGIC_NUMBER_BE AI_MAKE_MAGIC("IDP2") #define AI_MD2_MAGIC_NUMBER_LE AI_MAKE_MAGIC("2PDI") diff --git a/code/AssetLib/MD3/MD3FileData.h b/code/AssetLib/MD3/MD3FileData.h index 4251243b3..86d2647b6 100644 --- a/code/AssetLib/MD3/MD3FileData.h +++ b/code/AssetLib/MD3/MD3FileData.h @@ -62,7 +62,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace Assimp { namespace MD3 { -// to make it easier for us, we test the magic word against both "endianesses" +// to make it easier for us, we test the magic word against both "endiannesses" #define AI_MD3_MAGIC_NUMBER_BE AI_MAKE_MAGIC("IDP3") #define AI_MD3_MAGIC_NUMBER_LE AI_MAKE_MAGIC("3PDI") diff --git a/code/AssetLib/MDC/MDCFileData.h b/code/AssetLib/MDC/MDCFileData.h index 5d7084b5d..4c5b4127c 100644 --- a/code/AssetLib/MDC/MDCFileData.h +++ b/code/AssetLib/MDC/MDCFileData.h @@ -61,7 +61,7 @@ http://themdcfile.planetwolfenstein.gamespy.com/MDC_File_Format.pdf namespace Assimp { namespace MDC { -// to make it easier for us, we test the magic word against both "endianesses" +// to make it easier for us, we test the magic word against both "endiannesses" #define AI_MDC_MAGIC_NUMBER_BE AI_MAKE_MAGIC("CPDI") #define AI_MDC_MAGIC_NUMBER_LE AI_MAKE_MAGIC("IDPC") diff --git a/code/AssetLib/MDL/MDLFileData.h b/code/AssetLib/MDL/MDLFileData.h index 62117e788..2aff59856 100644 --- a/code/AssetLib/MDL/MDLFileData.h +++ b/code/AssetLib/MDL/MDLFileData.h @@ -67,7 +67,7 @@ namespace Assimp { namespace MDL { // ------------------------------------------------------------------------------------- -// to make it easier for us, we test the magic word against both "endianesses" +// to make it easier for us, we test the magic word against both "endiannesses" // magic bytes used in Quake 1 MDL meshes #define AI_MDL_MAGIC_NUMBER_BE AI_MAKE_MAGIC("IDPO") diff --git a/doc/dox.h b/doc/dox.h index 1d5f59aa4..2fb127a2b 100644 --- a/doc/dox.h +++ b/doc/dox.h @@ -1545,7 +1545,7 @@ Don't trust the input data! Check all offsets! Mixed stuff for internal use by loaders, mostly documented (most of them are already included by AssimpPCH.h):
  • ByteSwapper (ByteSwapper.h) - manual byte swapping stuff for binary loaders.
  • -
  • StreamReader (StreamReader.h) - safe, endianess-correct, binary reading.
  • +
  • StreamReader (StreamReader.h) - safe, endianness-correct, binary reading.
  • IrrXML (irrXMLWrapper.h) - for XML-parsing (SAX.
  • CommentRemover (RemoveComments.h) - remove single-line and multi-line comments from a text file.
  • fast_atof, strtoul10, strtoul16, SkipSpaceAndLineEnd, SkipToNextToken .. large family of low-level diff --git a/include/assimp/ByteSwapper.h b/include/assimp/ByteSwapper.h index 179f7b555..f738ae701 100644 --- a/include/assimp/ByteSwapper.h +++ b/include/assimp/ByteSwapper.h @@ -263,7 +263,7 @@ struct ByteSwapper { }; // -------------------------------------------------------------------------------------------- -template +template struct Getter { void operator() (T* inout, bool le) { #ifdef AI_BUILD_BIG_ENDIAN @@ -278,12 +278,12 @@ struct Getter { } }; -template -struct Getter { +template +struct Getter { void operator() (T* inout, bool /*le*/) { // static branch - ByteSwapper1)> () (inout); + ByteSwapper1)> () (inout); } }; } // end Intern diff --git a/include/assimp/StreamReader.h b/include/assimp/StreamReader.h index 66e83b7ac..cc74bd652 100644 --- a/include/assimp/StreamReader.h +++ b/include/assimp/StreamReader.h @@ -68,7 +68,7 @@ namespace Assimp { * * XXX switch from unsigned int for size types to size_t? or ptrdiff_t?*/ // -------------------------------------------------------------------------------------------- -template +template class StreamReader { public: using diff = size_t; @@ -84,7 +84,7 @@ public: * reads from the current position to the end of the stream. * @param le If @c RuntimeSwitch is true: specifies whether the * stream is in little endian byte order. Otherwise the - * endianness information is contained in the @c SwapEndianess + * endianness information is contained in the @c SwapEndianness * template parameter and this parameter is meaningless. */ StreamReader(std::shared_ptr stream, bool le = false) : mStream(stream), @@ -291,7 +291,7 @@ public: T f; ::memcpy(&f, mCurrent, sizeof(T)); - Intern::Getter()(&f, mLe); + Intern::Getter()(&f, mLe); mCurrent += sizeof(T); return f; diff --git a/include/assimp/StreamWriter.h b/include/assimp/StreamWriter.h index 7b84789d1..32da6911b 100644 --- a/include/assimp/StreamWriter.h +++ b/include/assimp/StreamWriter.h @@ -65,7 +65,7 @@ namespace Assimp { * stream is to be determined at runtime. */ // -------------------------------------------------------------------------------------------- -template +template class StreamWriter { enum { INITIAL_CAPACITY = 1024 @@ -82,7 +82,7 @@ public: continues at the current position of the stream cursor. * @param le If @c RuntimeSwitch is true: specifies whether the * stream is in little endian byte order. Otherwise the - * endianness information is defined by the @c SwapEndianess + * endianness information is defined by the @c SwapEndianness * template parameter and this parameter is meaningless. */ StreamWriter(std::shared_ptr stream, bool le = false) : stream(stream) @@ -260,7 +260,7 @@ public: /** Generic write method. ByteSwap::Swap(T*) *must* be defined */ template void Put(T f) { - Intern :: Getter() (&f, le); + Intern :: Getter() (&f, le); if (cursor + sizeof(T) >= buffer.size()) { buffer.resize(cursor + sizeof(T)); From 790aad4b62a2886f262e51665e9cf0037d33750b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Gonz=C3=A1lez?= <7822554+AlexTMjugador@users.noreply.github.com> Date: Sun, 7 Apr 2024 00:25:46 +0200 Subject: [PATCH 3/3] Add macOS support to C4D importer (#5516) The latest Cineware SDK explicitly asserts macOS support in its documentation, but Assimp's C4D importer only works with Windows MSVC targets. Let's improve its portability by refactoring importer code to not depend on MSVC-only data types and quirks, and add support for linking against the universal macOS static libraries provided in the Cineware SDK. Note that the C4D importer still cannot support Linux platforms because Maxon does not provide the necessary precompiled Cineware libraries for that platform. Windows MinGW targets are also out of the question as the MinGW toolchain uses compiled libraries in a different format. Co-authored-by: Kim Kulling --- CMakeLists.txt | 19 +++++++++++++++---- code/AssetLib/C4D/C4DImporter.cpp | 18 +++++++----------- code/AssetLib/C4D/C4DImporter.h | 2 ++ 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 70399798d..676ef269e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -563,9 +563,9 @@ SET ( ASSIMP_BUILD_NONFREE_C4D_IMPORTER OFF CACHE BOOL ) IF (ASSIMP_BUILD_NONFREE_C4D_IMPORTER) - IF ( MSVC ) - SET(C4D_INCLUDES "${CMAKE_CURRENT_SOURCE_DIR}/contrib/Cineware/includes") + SET(C4D_INCLUDES "${CMAKE_CURRENT_SOURCE_DIR}/contrib/Cineware/includes") + IF (WIN32) # pick the correct prebuilt library IF(MSVC143) SET(C4D_LIB_POSTFIX "_2022") @@ -583,7 +583,7 @@ IF (ASSIMP_BUILD_NONFREE_C4D_IMPORTER) SET(C4D_LIB_POSTFIX "_2010") ELSE() MESSAGE( FATAL_ERROR - "C4D is currently only supported with MSVC 10, 11, 12, 14, 14.2, 14.3" + "C4D for Windows is currently only supported with MSVC 10, 11, 12, 14, 14.2, 14.3" ) ENDIF() @@ -601,9 +601,20 @@ IF (ASSIMP_BUILD_NONFREE_C4D_IMPORTER) # winsock and winmm are necessary (and undocumented) dependencies of Cineware SDK because # it can be used to communicate with a running Cinema 4D instance SET(C4D_EXTRA_LIBRARIES WSock32.lib Winmm.lib) + ELSEIF (APPLE) + SET(C4D_LIB_BASE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/contrib/Cineware/libraries/osx") + + SET(C4D_DEBUG_LIBRARIES + "${C4D_LIB_BASE_PATH}/debug/libcinewarelib.a" + "${C4D_LIB_BASE_PATH}/debug/libjpeglib.a" + ) + SET(C4D_RELEASE_LIBRARIES + "${C4D_LIB_BASE_PATH}/release/libcinewarelib.a" + "${C4D_LIB_BASE_PATH}/release/libjpeglib.a" + ) ELSE () MESSAGE( FATAL_ERROR - "C4D is currently only available on Windows with Cineware SDK installed in contrib/Cineware" + "C4D is currently only available on Windows and macOS with Cineware SDK installed in contrib/Cineware" ) ENDIF () ELSE () diff --git a/code/AssetLib/C4D/C4DImporter.cpp b/code/AssetLib/C4D/C4DImporter.cpp index c11ec0280..daef6ebe4 100644 --- a/code/AssetLib/C4D/C4DImporter.cpp +++ b/code/AssetLib/C4D/C4DImporter.cpp @@ -46,10 +46,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // no #ifdefing here, Cinema4D support is carried out in a branch of assimp // where it is turned on in the CMake settings. -#ifndef _MSC_VER -# error C4D support is currently MSVC only -#endif - #include "C4DImporter.h" #include #include @@ -111,7 +107,7 @@ C4DImporter::C4DImporter() = default; C4DImporter::~C4DImporter() = default; // ------------------------------------------------------------------------------------------------ -bool C4DImporter::CanRead( const std::string& pFile, IOSystem* /*pIOHandler*/, bool /*checkSig*/) const { +bool C4DImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const { const std::string& extension = GetExtension(pFile); if (extension == "c4d") { return true; @@ -305,7 +301,7 @@ void C4DImporter::RecurseHierarchy(BaseObject* object, aiNode* parent) { // based on Cineware sample code while (object) { - const LONG type = object->GetType(); + const Int32 type = object->GetType(); const Matrix& ml = object->GetMl(); aiNode* const nd = new aiNode(); @@ -368,8 +364,8 @@ aiMesh* C4DImporter::ReadMesh(BaseObject* object) { PolygonObject* const polyObject = dynamic_cast(object); ai_assert(polyObject != nullptr); - const LONG pointCount = polyObject->GetPointCount(); - const LONG polyCount = polyObject->GetPolygonCount(); + const Int32 pointCount = polyObject->GetPointCount(); + const Int32 polyCount = polyObject->GetPolygonCount(); if(!polyObject || !pointCount) { LogWarn("ignoring mesh with zero vertices or faces"); return nullptr; @@ -391,7 +387,7 @@ aiMesh* C4DImporter::ReadMesh(BaseObject* object) { unsigned int vcount = 0; // first count vertices - for (LONG i = 0; i < polyCount; i++) + for (Int32 i = 0; i < polyCount; i++) { vcount += 3; @@ -434,7 +430,7 @@ aiMesh* C4DImporter::ReadMesh(BaseObject* object) { } // copy vertices and extra channels over and populate faces - for (LONG i = 0; i < polyCount; ++i, ++face) { + for (Int32 i = 0; i < polyCount; ++i, ++face) { ai_assert(polys[i].a < pointCount && polys[i].a >= 0); const Vector& pointA = points[polys[i].a]; verts->x = pointA.x; @@ -511,7 +507,7 @@ aiMesh* C4DImporter::ReadMesh(BaseObject* object) { if (tangents_src) { for(unsigned int k = 0; k < face->mNumIndices; ++k) { - LONG l; + Int32 l; switch(k) { case 0: l = polys[i].a; diff --git a/code/AssetLib/C4D/C4DImporter.h b/code/AssetLib/C4D/C4DImporter.h index c44cf5e37..effd2af09 100644 --- a/code/AssetLib/C4D/C4DImporter.h +++ b/code/AssetLib/C4D/C4DImporter.h @@ -78,6 +78,8 @@ namespace Assimp { // ------------------------------------------------------------------------------------------- class C4DImporter : public BaseImporter, public LogFunctions { public: + C4DImporter(); + ~C4DImporter() override; bool CanRead( const std::string& pFile, IOSystem*, bool checkSig) const override; protected: