diff --git a/.gitignore b/.gitignore index 1b6acd509..d0d5e9631 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ assimp.pc revision.h contrib/zlib/zconf.h contrib/zlib/zlib.pc +include/assimp/config.h # CMake CMakeCache.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 8455bb8bc..67fd67f94 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -80,15 +80,30 @@ IF(NOT GIT_COMMIT_HASH) SET(GIT_COMMIT_HASH 0) ENDIF(NOT GIT_COMMIT_HASH) +OPTION(ASSIMP_DOUBLE_PRECISION + "Set to ON to enable double precision processing" + OFF +) + +IF(ASSIMP_DOUBLE_PRECISION) + ADD_DEFINITIONS(-DAI_DOUBLE_PRECISION) +ENDIF(ASSIMP_DOUBLE_PRECISION) + configure_file( ${CMAKE_CURRENT_LIST_DIR}/revision.h.in # ${CMAKE_CURRENT_SOURCE_DIR}/revision.h.in ${CMAKE_CURRENT_BINARY_DIR}/revision.h ) +configure_file( + ${CMAKE_CURRENT_LIST_DIR}/include/assimp/config.h.in + ${CMAKE_CURRENT_LIST_DIR}/include/assimp/config.h +) + include_directories( ./ ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_BINARY_DIR}/include ) OPTION(ASSIMP_OPT_BUILD_PACKAGES "Set to ON to generate CPack configuration files and packaging targets" OFF) @@ -136,11 +151,11 @@ IF ( CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR ) ENDIF ( CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR ) # Cache these to allow the user to override them manually. -SET( ASSIMP_LIB_INSTALL_DIR "lib" CACHE PATH +SET( ASSIMP_LIB_INSTALL_DIR "lib" CACHE STRING "Path the built library files are installed to." ) -SET( ASSIMP_INCLUDE_INSTALL_DIR "include" CACHE PATH +SET( ASSIMP_INCLUDE_INSTALL_DIR "include" CACHE STRING "Path the header files are installed to." ) -SET( ASSIMP_BIN_INSTALL_DIR "bin" CACHE PATH +SET( ASSIMP_BIN_INSTALL_DIR "bin" CACHE STRING "Path the tool executables are installed to." ) IF (CMAKE_BUILD_TYPE STREQUAL "Debug") diff --git a/assimp.pc.in b/assimp.pc.in index ecb7074d3..5b2139e6d 100644 --- a/assimp.pc.in +++ b/assimp.pc.in @@ -1,5 +1,5 @@ prefix=@CMAKE_INSTALL_PREFIX@ -exec_prefix=@CMAKE_INSTALL_PREFIX@/@ASSIMP_BIN_INSTALL_DIR@ +exec_prefix=@CMAKE_INSTALL_PREFIX@/ libdir=@CMAKE_INSTALL_PREFIX@/@ASSIMP_LIB_INSTALL_DIR@ includedir=@CMAKE_INSTALL_PREFIX@/@ASSIMP_INCLUDE_INSTALL_DIR@/assimp diff --git a/code/3DSConverter.cpp b/code/3DSConverter.cpp index cb6fd9077..619360524 100644 --- a/code/3DSConverter.cpp +++ b/code/3DSConverter.cpp @@ -197,7 +197,7 @@ void CopyTexture(aiMaterial& mat, D3DS::Texture& texture, aiTextureType type) // Setup the texture blend factor if (is_not_qnan(texture.mTextureBlend)) - mat.AddProperty( &texture.mTextureBlend, 1, AI_MATKEY_TEXBLEND(type,0)); + mat.AddProperty( &texture.mTextureBlend, 1, AI_MATKEY_TEXBLEND(type,0)); // Setup the texture mapping mode mat.AddProperty((int*)&texture.mMapMode,1,AI_MATKEY_MAPPINGMODE_U(type,0)); @@ -207,14 +207,14 @@ void CopyTexture(aiMaterial& mat, D3DS::Texture& texture, aiTextureType type) // FIXME: this is not really correct ... if (texture.mMapMode == aiTextureMapMode_Mirror) { - texture.mScaleU *= 2.f; - texture.mScaleV *= 2.f; - texture.mOffsetU /= 2.f; - texture.mOffsetV /= 2.f; + texture.mScaleU *= 2.0; + texture.mScaleV *= 2.0; + texture.mOffsetU /= 2.0; + texture.mOffsetV /= 2.0; } // Setup texture UV transformations - mat.AddProperty(&texture.mOffsetU,5,AI_MATKEY_UVTRANSFORM(type,0)); + mat.AddProperty(&texture.mOffsetU,5,AI_MATKEY_UVTRANSFORM(type,0)); } // ------------------------------------------------------------------------------------------------ @@ -265,10 +265,10 @@ void Discreet3DSImporter::ConvertMaterial(D3DS::Material& oldMat, } // Opacity - mat.AddProperty( &oldMat.mTransparency,1,AI_MATKEY_OPACITY); + mat.AddProperty( &oldMat.mTransparency,1,AI_MATKEY_OPACITY); // Bump height scaling - mat.AddProperty( &oldMat.mBumpHeight,1,AI_MATKEY_BUMPSCALING); + mat.AddProperty( &oldMat.mBumpHeight,1,AI_MATKEY_BUMPSCALING); // Two sided rendering? if (oldMat.mTwoSided) diff --git a/code/3DSHelper.h b/code/3DSHelper.h index 5911b9d47..e2979bd0f 100644 --- a/code/3DSHelper.h +++ b/code/3DSHelper.h @@ -327,11 +327,11 @@ struct Texture { //! Default constructor Texture() - : mOffsetU (0.0f) - , mOffsetV (0.0f) - , mScaleU (1.0f) - , mScaleV (1.0f) - , mRotation (0.0f) + : mOffsetU (0.0) + , mOffsetV (0.0) + , mScaleU (1.0) + , mScaleV (1.0) + , mRotation (0.0) , mMapMode (aiTextureMapMode_Wrap) , bPrivate() , iUVSrc (0) @@ -340,17 +340,17 @@ struct Texture } //! Specifies the blend factor for the texture - float mTextureBlend; + ai_real mTextureBlend; //! Specifies the filename of the texture std::string mMapName; //! Specifies texture coordinate offsets/scaling/rotations - float mOffsetU; - float mOffsetV; - float mScaleU; - float mScaleV; - float mRotation; + ai_real mOffsetU; + ai_real mOffsetV; + ai_real mScaleU; + ai_real mScaleV; + ai_real mRotation; //! Specifies the mapping mode to be used for the texture aiTextureMapMode mMapMode; @@ -369,12 +369,12 @@ struct Material //! Default constructor. Builds a default name for the material Material() : - mDiffuse (0.6f,0.6f,0.6f), // FIX ... we won't want object to be black - mSpecularExponent (0.0f), - mShininessStrength (1.0f), + mDiffuse (0.6,0.6,0.6), // FIX ... we won't want object to be black + mSpecularExponent (0.0), + mShininessStrength (1.0), mShading(Discreet3DS::Gouraud), - mTransparency (1.0f), - mBumpHeight (1.0f), + mTransparency (1.0), + mBumpHeight (1.0), mTwoSided (false) { static int iCnt = 0; @@ -389,9 +389,9 @@ struct Material //! Diffuse color of the material aiColor3D mDiffuse; //! Specular exponent - float mSpecularExponent; + ai_real mSpecularExponent; //! Shininess strength, in percent - float mShininessStrength; + ai_real mShininessStrength; //! Specular color of the material aiColor3D mSpecular; //! Ambient color of the material @@ -399,7 +399,7 @@ struct Material //! Shading type to be used Discreet3DS::shadetype3ds mShading; //! Opacity of the material - float mTransparency; + ai_real mTransparency; //! Diffuse texture channel Texture sTexDiffuse; //! Opacity texture channel @@ -415,7 +415,7 @@ struct Material //! Shininess texture channel Texture sTexShininess; //! Scaling factor for the bump values - float mBumpHeight; + ai_real mBumpHeight; //! Emissive color aiColor3D mEmissive; //! Ambient texture channel @@ -459,7 +459,7 @@ struct Mesh : public MeshWithSmoothingGroups struct aiFloatKey { double mTime; ///< The time of this key - float mValue; ///< The value of this key + ai_real mValue; ///< The value of this key #ifdef __cplusplus diff --git a/code/3DSLoader.cpp b/code/3DSLoader.cpp index a2b73b2cb..59d598f20 100644 --- a/code/3DSLoader.cpp +++ b/code/3DSLoader.cpp @@ -458,20 +458,20 @@ void Discreet3DSImporter::ParseChunk(const char* name, unsigned int num) camera->mLookAt.x = stream->GetF4() - camera->mPosition.x; camera->mLookAt.y = stream->GetF4() - camera->mPosition.y; camera->mLookAt.z = stream->GetF4() - camera->mPosition.z; - float len = camera->mLookAt.Length(); - if (len < 1e-5f) { + ai_real len = camera->mLookAt.Length(); + if (len < 1e-5) { // There are some files with lookat == position. Don't know why or whether it's ok or not. DefaultLogger::get()->error("3DS: Unable to read proper camera look-at vector"); - camera->mLookAt = aiVector3D(0.f,1.f,0.f); + camera->mLookAt = aiVector3D(0.0,1.0,0.0); } else camera->mLookAt /= len; // And finally - the camera rotation angle, in counter clockwise direction - const float angle = AI_DEG_TO_RAD( stream->GetF4() ); + const ai_real angle = AI_DEG_TO_RAD( stream->GetF4() ); aiQuaternion quat(camera->mLookAt,angle); - camera->mUp = quat.GetMatrix() * aiVector3D(0.f,1.f,0.f); + camera->mUp = quat.GetMatrix() * aiVector3D(0.0,1.0,0.0); // Read the lense angle camera->mHorizontalFOV = AI_DEG_TO_RAD ( stream->GetF4() ); @@ -1167,13 +1167,13 @@ void Discreet3DSImporter::ParseMaterialChunk() case Discreet3DS::CHUNK_MAT_TRANSPARENCY: { // This is the material's transparency - float* pcf = &mScene->mMaterials.back().mTransparency; + ai_real* pcf = &mScene->mMaterials.back().mTransparency; *pcf = ParsePercentageChunk(); // NOTE: transparency, not opacity if (is_qnan(*pcf)) - *pcf = 1.0f; - else *pcf = 1.0f - *pcf * (float)0xFFFF / 100.0f; + *pcf = 1.0; + else *pcf = 1.0 - *pcf * (ai_real)0xFFFF / 100.0; } break; @@ -1189,30 +1189,30 @@ void Discreet3DSImporter::ParseMaterialChunk() case Discreet3DS::CHUNK_MAT_SHININESS: { // This is the shininess of the material - float* pcf = &mScene->mMaterials.back().mSpecularExponent; + ai_real* pcf = &mScene->mMaterials.back().mSpecularExponent; *pcf = ParsePercentageChunk(); if (is_qnan(*pcf)) - *pcf = 0.0f; - else *pcf *= (float)0xFFFF; + *pcf = 0.0; + else *pcf *= (ai_real)0xFFFF; } break; case Discreet3DS::CHUNK_MAT_SHININESS_PERCENT: { // This is the shininess strength of the material - float* pcf = &mScene->mMaterials.back().mShininessStrength; + ai_real* pcf = &mScene->mMaterials.back().mShininessStrength; *pcf = ParsePercentageChunk(); if (is_qnan(*pcf)) - *pcf = 0.0f; - else *pcf *= (float)0xffff / 100.0f; + *pcf = 0.0; + else *pcf *= (ai_real)0xffff / 100.0; } break; case Discreet3DS::CHUNK_MAT_SELF_ILPCT: { // This is the self illumination strength of the material - float f = ParsePercentageChunk(); + ai_real f = ParsePercentageChunk(); if (is_qnan(f)) - f = 0.0f; - else f *= (float)0xFFFF / 100.0f; + f = 0.0; + else f *= (ai_real)0xFFFF / 100.0; mScene->mMaterials.back().mEmissive = aiColor3D(f,f,f); } break; @@ -1277,7 +1277,7 @@ void Discreet3DSImporter::ParseTextureChunk(D3DS::Texture* pcOut) case Discreet3DS::CHUNK_PERCENTW: // Manually parse the blend factor - pcOut->mTextureBlend = (float)((uint16_t)stream->GetI2()) / 100.0f; + pcOut->mTextureBlend = (ai_real)((uint16_t)stream->GetI2()) / 100.0; break; case Discreet3DS::CHUNK_MAT_MAP_USCALE: @@ -1336,7 +1336,7 @@ void Discreet3DSImporter::ParseTextureChunk(D3DS::Texture* pcOut) // ------------------------------------------------------------------------------------------------ // Read a percentage chunk -float Discreet3DSImporter::ParsePercentageChunk() +ai_real Discreet3DSImporter::ParsePercentageChunk() { Discreet3DS::Chunk chunk; ReadChunk(&chunk); @@ -1344,7 +1344,7 @@ float Discreet3DSImporter::ParsePercentageChunk() if (Discreet3DS::CHUNK_PERCENTF == chunk.Flag) return stream->GetF4(); else if (Discreet3DS::CHUNK_PERCENTW == chunk.Flag) - return (float)((uint16_t)stream->GetI2()) / (float)0xFFFF; + return (ai_real)((uint16_t)stream->GetI2()) / (ai_real)0xFFFF; return get_qnan(); } @@ -1356,7 +1356,7 @@ void Discreet3DSImporter::ParseColorChunk(aiColor3D* out, ai_assert(out != NULL); // error return value - const float qnan = get_qnan(); + const ai_real qnan = get_qnan(); static const aiColor3D clrError = aiColor3D(qnan,qnan,qnan); Discreet3DS::Chunk chunk; @@ -1372,7 +1372,7 @@ void Discreet3DSImporter::ParseColorChunk(aiColor3D* out, bGamma = true; case Discreet3DS::CHUNK_RGBF: - if (sizeof(float) * 3 > diff) { + if (sizeof(ai_real) * 3 > diff) { *out = clrError; return; } @@ -1388,9 +1388,9 @@ void Discreet3DSImporter::ParseColorChunk(aiColor3D* out, *out = clrError; return; } - out->r = (float)(uint8_t)stream->GetI1() / 255.0f; - out->g = (float)(uint8_t)stream->GetI1() / 255.0f; - out->b = (float)(uint8_t)stream->GetI1() / 255.0f; + out->r = (ai_real)(uint8_t)stream->GetI1() / 255.0; + out->g = (ai_real)(uint8_t)stream->GetI1() / 255.0; + out->b = (ai_real)(uint8_t)stream->GetI1() / 255.0; break; // Percentage chunks are accepted, too. @@ -1404,7 +1404,7 @@ void Discreet3DSImporter::ParseColorChunk(aiColor3D* out, case Discreet3DS::CHUNK_PERCENTW: if (acceptPercent && 1 <= diff) { - out->g = out->b = out->r = (float)(uint8_t)stream->GetI1() / 255.0f; + out->g = out->b = out->r = (ai_real)(uint8_t)stream->GetI1() / 255.0; break; } *out = clrError; diff --git a/code/3DSLoader.h b/code/3DSLoader.h index 437ec94b4..26b2a935e 100644 --- a/code/3DSLoader.h +++ b/code/3DSLoader.h @@ -119,7 +119,7 @@ protected: * chunk behind afterwards. If no percentage chunk is found * QNAN is returned. */ - float ParsePercentageChunk(); + ai_real ParsePercentageChunk(); // ------------------------------------------------------------------- /** Parse a color chunk. mCurrent will point to the next @@ -265,7 +265,7 @@ protected: aiColor3D mClrAmbient; /** Master scaling factor of the scene */ - float mMasterScale; + ai_real mMasterScale; /** Path to the background image of the scene */ std::string mBackgroundImage; diff --git a/code/ASELoader.cpp b/code/ASELoader.cpp index 39a33e9fd..ed01c17e1 100644 --- a/code/ASELoader.cpp +++ b/code/ASELoader.cpp @@ -819,10 +819,10 @@ void CopyASETexture(aiMaterial& mat, ASE::Texture& texture, aiTextureType type) // Setup the texture blend factor if (is_not_qnan(texture.mTextureBlend)) - mat.AddProperty( &texture.mTextureBlend, 1, AI_MATKEY_TEXBLEND(type,0)); + mat.AddProperty( &texture.mTextureBlend, 1, AI_MATKEY_TEXBLEND(type,0)); // Setup texture UV transformations - mat.AddProperty(&texture.mOffsetU,5,AI_MATKEY_UVTRANSFORM(type,0)); + mat.AddProperty(&texture.mOffsetU,5,AI_MATKEY_UVTRANSFORM(type,0)); } // ------------------------------------------------------------------------------------------------ @@ -865,7 +865,7 @@ void ASEImporter::ConvertMaterial(ASE::Material& mat) } // opacity - mat.pcInstance->AddProperty( &mat.mTransparency,1,AI_MATKEY_OPACITY); + mat.pcInstance->AddProperty( &mat.mTransparency,1,AI_MATKEY_OPACITY); // Two sided rendering? if (mat.mTwoSided) diff --git a/code/ASEParser.cpp b/code/ASEParser.cpp index 204f8bf62..01c58d259 100644 --- a/code/ASEParser.cpp +++ b/code/ASEParser.cpp @@ -431,7 +431,7 @@ void Parser::ParseLV1SoftSkinBlock() ParseString(bone,"*MESH_SOFTSKINVERTS.Bone"); // Find the bone in the mesh's list - std::pair me; + std::pair me; me.first = -1; for (unsigned int n = 0; n < curMesh->mBones.size();++n) @@ -618,12 +618,12 @@ void Parser::ParseLV2MaterialBlock(ASE::Material& mat) if (TokenMatch(filePtr,"MATERIAL_TRANSPARENCY",21)) { ParseLV4MeshFloat(mat.mTransparency); - mat.mTransparency = 1.0f - mat.mTransparency;continue; + mat.mTransparency = 1.0 - mat.mTransparency;continue; } // material self illumination if (TokenMatch(filePtr,"MATERIAL_SELFILLUM",18)) { - float f = 0.0f; + ai_real f = 0.0; ParseLV4MeshFloat(f); mat.mEmissive.r = f; @@ -1251,7 +1251,7 @@ void Parser::ParseLV3RotAnimationBlock(ASE::Animation& anim) { anim.akeyRotations.push_back(aiQuatKey()); aiQuatKey& key = anim.akeyRotations.back(); - aiVector3D v;float f; + aiVector3D v;ai_real f; ParseLV4MeshFloatTriple(&v.x,iIndex); ParseLV4MeshFloat(f); key.mTime = (double)iIndex; @@ -1604,7 +1604,7 @@ void Parser::ParseLV4MeshBonesVertices(unsigned int iNumVertices,ASE::Mesh& mesh } // --- ignored - float afVert[3]; + ai_real afVert[3]; ParseLV4MeshFloatTriple(afVert); std::pair pairOut; @@ -2102,7 +2102,7 @@ void Parser::ParseLV4MeshLongTriple(unsigned int* apOut, unsigned int& rIndexOut ParseLV4MeshLongTriple(apOut); } // ------------------------------------------------------------------------------------------------ -void Parser::ParseLV4MeshFloatTriple(float* apOut, unsigned int& rIndexOut) +void Parser::ParseLV4MeshFloatTriple(ai_real* apOut, unsigned int& rIndexOut) { ai_assert(NULL != apOut); @@ -2113,7 +2113,7 @@ void Parser::ParseLV4MeshFloatTriple(float* apOut, unsigned int& rIndexOut) ParseLV4MeshFloatTriple(apOut); } // ------------------------------------------------------------------------------------------------ -void Parser::ParseLV4MeshFloatTriple(float* apOut) +void Parser::ParseLV4MeshFloatTriple(ai_real* apOut) { ai_assert(NULL != apOut); @@ -2121,19 +2121,19 @@ void Parser::ParseLV4MeshFloatTriple(float* apOut) ParseLV4MeshFloat(apOut[i]); } // ------------------------------------------------------------------------------------------------ -void Parser::ParseLV4MeshFloat(float& fOut) +void Parser::ParseLV4MeshFloat(ai_real& fOut) { // skip spaces and tabs if(!SkipSpaces(&filePtr)) { // LOG LogWarning("Unable to parse float: unexpected EOL [#1]"); - fOut = 0.0f; + fOut = 0.0; ++iLineNumber; return; } // parse the first float - filePtr = fast_atoreal_move(filePtr,fOut); + filePtr = fast_atoreal_move(filePtr,fOut); } // ------------------------------------------------------------------------------------------------ void Parser::ParseLV4MeshLong(unsigned int& iOut) diff --git a/code/ASEParser.h b/code/ASEParser.h index 667c7c5a0..095d089d4 100644 --- a/code/ASEParser.h +++ b/code/ASEParser.h @@ -222,7 +222,7 @@ struct BaseNode mName = szTemp; // Set mTargetPosition to qnan - const float qnan = get_qnan(); + const ai_real qnan = get_qnan(); mTargetPosition.x = qnan; } @@ -317,9 +317,9 @@ struct Light : public BaseNode LightType mLightType; aiColor3D mColor; - float mIntensity; - float mAngle; // in degrees - float mFalloff; + ai_real mIntensity; + ai_real mAngle; // in degrees + ai_real mFalloff; }; // --------------------------------------------------------------------------- @@ -342,7 +342,7 @@ struct Camera : public BaseNode { } - float mFOV, mNear, mFar; + ai_real mFOV, mNear, mFar; CameraType mCameraType; }; @@ -544,13 +544,13 @@ private: //! (also works for MESH_TVERT, MESH_CFACE, MESH_VERTCOL ...) //! \param apOut Output buffer (3 floats) //! \param rIndexOut Output index - void ParseLV4MeshFloatTriple(float* apOut, unsigned int& rIndexOut); + void ParseLV4MeshFloatTriple(ai_real* apOut, unsigned int& rIndexOut); // ------------------------------------------------------------------- //! Parse a *MESH_VERT block in a file //! (also works for MESH_TVERT, MESH_CFACE, MESH_VERTCOL ...) //! \param apOut Output buffer (3 floats) - void ParseLV4MeshFloatTriple(float* apOut); + void ParseLV4MeshFloatTriple(ai_real* apOut); // ------------------------------------------------------------------- //! Parse a *MESH_TFACE block in a file @@ -568,7 +568,7 @@ private: // ------------------------------------------------------------------- //! Parse a single float element //! \param fOut Output float - void ParseLV4MeshFloat(float& fOut); + void ParseLV4MeshFloat(ai_real& fOut); // ------------------------------------------------------------------- //! Parse a single int element diff --git a/code/Assimp.cpp b/code/Assimp.cpp index 8507c8641..c28da95ee 100644 --- a/code/Assimp.cpp +++ b/code/Assimp.cpp @@ -546,11 +546,11 @@ ASSIMP_API void aiSetImportPropertyInteger(aiPropertyStore* p, const char* szNam // ------------------------------------------------------------------------------------------------ // Importer::SetPropertyFloat -ASSIMP_API void aiSetImportPropertyFloat(aiPropertyStore* p, const char* szName, float 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); + SetGenericProperty(pp->floats,szName,value); ASSIMP_END_EXCEPTION_REGION(void); } diff --git a/code/BlenderDNA.cpp b/code/BlenderDNA.cpp index 18ec9f2b4..19d08a590 100644 --- a/code/BlenderDNA.cpp +++ b/code/BlenderDNA.cpp @@ -53,7 +53,8 @@ using namespace Assimp; using namespace Assimp::Blender; using namespace Assimp::Formatter; -bool match4(StreamReaderAny& stream, const char* string) { +static bool match4(StreamReaderAny& stream, const char* string) { + ai_assert( nullptr != string ); char tmp[] = { (stream).GetI1(), (stream).GetI1(), @@ -69,7 +70,7 @@ struct Type { }; // ------------------------------------------------------------------------------------------------ -void DNAParser :: Parse () +void DNAParser::Parse () { StreamReaderAny& stream = *db.reader.get(); DNA& dna = db.dna; diff --git a/code/BlenderDNA.h b/code/BlenderDNA.h index 801d68fce..135e38d60 100644 --- a/code/BlenderDNA.h +++ b/code/BlenderDNA.h @@ -61,15 +61,17 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #define ASSIMP_BUILD_BLENDER_NO_STATS namespace Assimp { - template class StreamReader; - typedef StreamReader StreamReaderAny; - namespace Blender { - class FileDatabase; - struct FileBlockHead; +template class StreamReader; +typedef StreamReader StreamReaderAny; - template