diff --git a/CREDITS b/CREDITS index 2e7485fb7..5028bc306 100644 --- a/CREDITS +++ b/CREDITS @@ -151,3 +151,8 @@ Ogre Binary format support - Filip Wasil, Tieto Poland Sp. z o.o. Android JNI asset extraction support + +- Richard Steffen +Contributed X File exporter +Contributed ExportProperties interface + diff --git a/code/3DSExporter.cpp b/code/3DSExporter.cpp index c0d22a3e4..56480bc93 100644 --- a/code/3DSExporter.cpp +++ b/code/3DSExporter.cpp @@ -144,7 +144,7 @@ namespace { // ------------------------------------------------------------------------------------------------ // Worker function for exporting a scene to 3DS. Prototyped and registered in Exporter.cpp -void ExportScene3DS(const char* pFile, IOSystem* pIOSystem, const aiScene* pScene) +void ExportScene3DS(const char* pFile, IOSystem* pIOSystem, const aiScene* pScene, const ExportProperties* pProperties) { boost::shared_ptr outfile (pIOSystem->Open(pFile, "wb")); if(!outfile) { diff --git a/code/AssbinExporter.cpp b/code/AssbinExporter.cpp index 6b4da3e30..405b676be 100644 --- a/code/AssbinExporter.cpp +++ b/code/AssbinExporter.cpp @@ -754,7 +754,7 @@ inline size_t WriteArray(IOStream * stream, const T* in, unsigned int size) } }; -void ExportSceneAssbin(const char* pFile, IOSystem* pIOSystem, const aiScene* pScene) +void ExportSceneAssbin(const char* pFile, IOSystem* pIOSystem, const aiScene* pScene, const ExportProperties* pProperties) { AssbinExport exporter; exporter.WriteBinaryDump( pFile, pIOSystem, pScene ); diff --git a/code/AssxmlExporter.cpp b/code/AssxmlExporter.cpp index c2e3f1833..b6aabd393 100644 --- a/code/AssxmlExporter.cpp +++ b/code/AssxmlExporter.cpp @@ -621,7 +621,7 @@ void WriteDump(const aiScene* scene, IOStream* io, bool shortened) } // end of namespace AssxmlExport -void ExportSceneAssxml(const char* pFile, IOSystem* pIOSystem, const aiScene* pScene) +void ExportSceneAssxml(const char* pFile, IOSystem* pIOSystem, const aiScene* pScene, const ExportProperties* pProperties) { IOStream * out = pIOSystem->Open( pFile, "wt" ); if (!out) return; diff --git a/code/ColladaExporter.cpp b/code/ColladaExporter.cpp index db76e38a9..e4cbab02c 100644 --- a/code/ColladaExporter.cpp +++ b/code/ColladaExporter.cpp @@ -59,7 +59,7 @@ namespace Assimp // ------------------------------------------------------------------------------------------------ // Worker function for exporting a scene to Collada. Prototyped and registered in Exporter.cpp -void ExportSceneCollada(const char* pFile, IOSystem* pIOSystem, const aiScene* pScene) +void ExportSceneCollada(const char* pFile, IOSystem* pIOSystem, const aiScene* pScene, const ExportProperties* pProperties) { std::string path = ""; std::string file = pFile; diff --git a/code/Exporter.cpp b/code/Exporter.cpp index 238430fa6..203070f8f 100644 --- a/code/Exporter.cpp +++ b/code/Exporter.cpp @@ -72,16 +72,16 @@ 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 -void ExportSceneCollada(const char*,IOSystem*, const aiScene*); -void ExportSceneXFile(const char*,IOSystem*, const aiScene*); -void ExportSceneObj(const char*,IOSystem*, const aiScene*); -void ExportSceneSTL(const char*,IOSystem*, const aiScene*); -void ExportSceneSTLBinary(const char*,IOSystem*, const aiScene*); -void ExportScenePly(const char*,IOSystem*, const aiScene*); -void ExportScenePlyBinary(const char*, IOSystem*, const aiScene*); -void ExportScene3DS(const char*, IOSystem*, const aiScene*); -void ExportSceneAssbin(const char*, IOSystem*, const aiScene*); -void ExportSceneAssxml(const char*, IOSystem*, const aiScene*); +void ExportSceneCollada(const char*,IOSystem*, const aiScene*, const ExportProperties*); +void ExportSceneXFile(const char*,IOSystem*, const aiScene*, const ExportProperties*); +void ExportSceneObj(const char*,IOSystem*, const aiScene*, const ExportProperties*); +void ExportSceneSTL(const char*,IOSystem*, const aiScene*, const ExportProperties*); +void ExportSceneSTLBinary(const char*,IOSystem*, const aiScene*, const ExportProperties*); +void ExportScenePly(const char*,IOSystem*, const aiScene*, const ExportProperties*); +void ExportScenePlyBinary(const char*, IOSystem*, const aiScene*, const ExportProperties*); +void ExportScene3DS(const char*, IOSystem*, const aiScene*, const ExportProperties*); +void ExportSceneAssbin(const char*, IOSystem*, const aiScene*, const ExportProperties*); +void ExportSceneAssxml(const char*, IOSystem*, const aiScene*, const ExportProperties*); // ------------------------------------------------------------------------------------------------ // global array of all export formats which Assimp supports in its current build @@ -91,7 +91,7 @@ Exporter::ExportFormatEntry gExporters[] = Exporter::ExportFormatEntry( "collada", "COLLADA - Digital Asset Exchange Schema", "dae", &ExportSceneCollada), #endif -#ifndef ASSIMP_BUILD_NO_FXILE_EXPORTER +#ifndef ASSIMP_BUILD_NO_XFILE_EXPORTER Exporter::ExportFormatEntry( "x", "X Files", "x", &ExportSceneXFile, aiProcess_MakeLeftHanded | aiProcess_FlipWindingOrder | aiProcess_FlipUVs), #endif @@ -226,7 +226,7 @@ bool Exporter :: IsDefaultIOHandler() const // ------------------------------------------------------------------------------------------------ -const aiExportDataBlob* Exporter :: ExportToBlob( const aiScene* pScene, const char* pFormatId, unsigned int ) +const aiExportDataBlob* Exporter :: ExportToBlob( const aiScene* pScene, const char* pFormatId, unsigned int, const ExportProperties* pProperties) { if (pimpl->blob) { delete pimpl->blob; @@ -282,7 +282,7 @@ bool IsVerboseFormat(const aiScene* pScene) // ------------------------------------------------------------------------------------------------ -aiReturn Exporter :: Export( const aiScene* pScene, const char* pFormatId, const char* pPath, unsigned int pPreprocessing ) +aiReturn Exporter :: Export( const aiScene* pScene, const char* pFormatId, const char* pPath, unsigned int pPreprocessing, const ExportProperties* pProperties) { ASSIMP_BEGIN_EXCEPTION_REGION(); @@ -290,7 +290,7 @@ aiReturn Exporter :: Export( const aiScene* pScene, const char* pFormatId, const // format. They will likely not be aware that there is a flag in the scene to indicate // this, however. To avoid surprises and bug reports, we check for duplicates in // meshes upfront. - const bool is_verbose_format = !(pScene->mFlags & AI_SCENE_FLAGS_NON_VERBOSE_FORMAT) || IsVerboseFormat(pScene); + const bool is_verbose_format = !(pScene->mFlags & AI_SCENE_FLAGS_NON_VERBOSE_FORMAT) || IsVerboseFormat(pScene); pimpl->mError = ""; for (size_t i = 0; i < pimpl->mExporters.size(); ++i) { @@ -397,7 +397,7 @@ aiReturn Exporter :: Export( const aiScene* pScene, const char* pFormatId, const proc.Execute(scenecopy.get()); } - exp.mExportFunction(pPath,pimpl->mIOSystem.get(),scenecopy.get()); + exp.mExportFunction(pPath,pimpl->mIOSystem.get(),scenecopy.get(), pProperties); } catch (DeadlyExportError& err) { pimpl->mError = err.what(); @@ -492,4 +492,116 @@ void Exporter :: UnregisterExporter(const char* id) } } +ExportProperties :: ExportProperties() {} + +ExportProperties::ExportProperties(const ExportProperties &other) + : mIntProperties(other.mIntProperties), + mFloatProperties(other.mFloatProperties), + mStringProperties(other.mStringProperties), + mMatrixProperties(other.mMatrixProperties) +{ + +} + + +// ------------------------------------------------------------------------------------------------ +// Set a configuration property +void ExportProperties :: SetPropertyInteger(const char* szName, int iValue, + bool* bWasExisting /*= NULL*/) +{ + SetGenericProperty(mIntProperties, szName,iValue,bWasExisting); +} + +// ------------------------------------------------------------------------------------------------ +// Set a configuration property +void ExportProperties :: SetPropertyFloat(const char* szName, float iValue, + bool* bWasExisting /*= NULL*/) +{ + SetGenericProperty(mFloatProperties, szName,iValue,bWasExisting); +} + +// ------------------------------------------------------------------------------------------------ +// Set a configuration property +void ExportProperties :: SetPropertyString(const char* szName, const std::string& value, + bool* bWasExisting /*= NULL*/) +{ + SetGenericProperty(mStringProperties, szName,value,bWasExisting); +} + +// ------------------------------------------------------------------------------------------------ +// Set a configuration property +void ExportProperties :: SetPropertyMatrix(const char* szName, const aiMatrix4x4& value, + bool* bWasExisting /*= NULL*/) +{ + SetGenericProperty(mMatrixProperties, szName,value,bWasExisting); +} + +// ------------------------------------------------------------------------------------------------ +// Get a configuration property +int ExportProperties :: GetPropertyInteger(const char* szName, + int iErrorReturn /*= 0xffffffff*/) const +{ + return GetGenericProperty(mIntProperties,szName,iErrorReturn); +} + +// ------------------------------------------------------------------------------------------------ +// Get a configuration property +float ExportProperties :: GetPropertyFloat(const char* szName, + float iErrorReturn /*= 10e10*/) const +{ + return GetGenericProperty(mFloatProperties,szName,iErrorReturn); +} + +// ------------------------------------------------------------------------------------------------ +// Get a configuration property +const std::string ExportProperties :: GetPropertyString(const char* szName, + const std::string& iErrorReturn /*= ""*/) const +{ + return GetGenericProperty(mStringProperties,szName,iErrorReturn); +} + +// ------------------------------------------------------------------------------------------------ +// Has a configuration property +const aiMatrix4x4 ExportProperties :: GetPropertyMatrix(const char* szName, + const aiMatrix4x4& iErrorReturn /*= aiMatrix4x4()*/) const +{ + return GetGenericProperty(mMatrixProperties,szName,iErrorReturn); +} + +// ------------------------------------------------------------------------------------------------ +// Has a configuration property +bool ExportProperties :: HasPropertyInteger(const char* szName) const +{ + return HasGenericProperty(mIntProperties, szName); +} + +// ------------------------------------------------------------------------------------------------ +// Has a configuration property +bool ExportProperties :: HasPropertyBool(const char* szName) const +{ + return HasGenericProperty(mIntProperties, szName); +}; + +// ------------------------------------------------------------------------------------------------ +// Has a configuration property +bool ExportProperties :: HasPropertyFloat(const char* szName) const +{ + return HasGenericProperty(mFloatProperties, szName); +}; + +// ------------------------------------------------------------------------------------------------ +// Has a configuration property +bool ExportProperties :: HasPropertyString(const char* szName) const +{ + return HasGenericProperty(mStringProperties, szName); +}; + +// ------------------------------------------------------------------------------------------------ +// Has a configuration property +bool ExportProperties :: HasPropertyMatrix(const char* szName) const +{ + return HasGenericProperty(mMatrixProperties, szName); +}; + + #endif // !ASSIMP_BUILD_NO_EXPORT diff --git a/code/GenericProperty.h b/code/GenericProperty.h index 32d846850..0e89015ab 100644 --- a/code/GenericProperty.h +++ b/code/GenericProperty.h @@ -108,5 +108,18 @@ inline void SetGenericPropertyPtr(std::map< unsigned int, T* >& list, *bWasExisting = true; } +// ------------------------------------------------------------------------------------------------ +template +inline const bool HasGenericProperty(const std::map< unsigned int, T >& list, + const char* szName) +{ + ai_assert(NULL != szName); + const uint32_t hash = SuperFastHash(szName); + + typename std::map::const_iterator it = list.find(hash); + if (it == list.end()) return false; + + return true; +} #endif // !! AI_GENERIC_PROPERTY_H_INCLUDED diff --git a/code/ObjExporter.cpp b/code/ObjExporter.cpp index 7ebb55b3e..c10c367b4 100644 --- a/code/ObjExporter.cpp +++ b/code/ObjExporter.cpp @@ -51,7 +51,7 @@ namespace Assimp { // ------------------------------------------------------------------------------------------------ // Worker function for exporting a scene to Wavefront OBJ. Prototyped and registered in Exporter.cpp -void ExportSceneObj(const char* pFile,IOSystem* pIOSystem, const aiScene* pScene) +void ExportSceneObj(const char* pFile,IOSystem* pIOSystem, const aiScene* pScene, const ExportProperties* pProperties) { // invoke the exporter ObjExporter exporter(pFile, pScene); diff --git a/code/PlyExporter.cpp b/code/PlyExporter.cpp index a214d1371..692b02668 100644 --- a/code/PlyExporter.cpp +++ b/code/PlyExporter.cpp @@ -50,7 +50,7 @@ namespace Assimp { // ------------------------------------------------------------------------------------------------ // Worker function for exporting a scene to PLY. Prototyped and registered in Exporter.cpp -void ExportScenePly(const char* pFile,IOSystem* pIOSystem, const aiScene* pScene) +void ExportScenePly(const char* pFile,IOSystem* pIOSystem, const aiScene* pScene, const ExportProperties* pProperties) { // invoke the exporter PlyExporter exporter(pFile, pScene); @@ -64,7 +64,7 @@ void ExportScenePly(const char* pFile,IOSystem* pIOSystem, const aiScene* pScene outfile->Write( exporter.mOutput.str().c_str(), static_cast(exporter.mOutput.tellp()),1); } -void ExportScenePlyBinary(const char* pFile, IOSystem* pIOSystem, const aiScene* pScene) +void ExportScenePlyBinary(const char* pFile, IOSystem* pIOSystem, const aiScene* pScene, const ExportProperties* pProperties) { // invoke the exporter PlyExporter exporter(pFile, pScene, true); diff --git a/code/STLExporter.cpp b/code/STLExporter.cpp index e3df2fbff..d45ece1ec 100644 --- a/code/STLExporter.cpp +++ b/code/STLExporter.cpp @@ -50,7 +50,7 @@ namespace Assimp { // ------------------------------------------------------------------------------------------------ // Worker function for exporting a scene to Stereolithograpy. Prototyped and registered in Exporter.cpp -void ExportSceneSTL(const char* pFile,IOSystem* pIOSystem, const aiScene* pScene) +void ExportSceneSTL(const char* pFile,IOSystem* pIOSystem, const aiScene* pScene, const ExportProperties* pProperties) { // invoke the exporter STLExporter exporter(pFile, pScene); @@ -63,7 +63,7 @@ void ExportSceneSTL(const char* pFile,IOSystem* pIOSystem, const aiScene* pScene outfile->Write( exporter.mOutput.str().c_str(), static_cast(exporter.mOutput.tellp()),1); } -void ExportSceneSTLBinary(const char* pFile,IOSystem* pIOSystem, const aiScene* pScene) +void ExportSceneSTLBinary(const char* pFile,IOSystem* pIOSystem, const aiScene* pScene, const ExportProperties* pProperties) { // invoke the exporter STLExporter exporter(pFile, pScene, true); diff --git a/code/XFileExporter.cpp b/code/XFileExporter.cpp index 2cd3c4d37..ce87f3168 100644 --- a/code/XFileExporter.cpp +++ b/code/XFileExporter.cpp @@ -59,7 +59,7 @@ namespace Assimp // ------------------------------------------------------------------------------------------------ // Worker function for exporting a scene to Collada. Prototyped and registered in Exporter.cpp -void ExportSceneXFile(const char* pFile,IOSystem* pIOSystem, const aiScene* pScene) +void ExportSceneXFile(const char* pFile,IOSystem* pIOSystem, const aiScene* pScene, const ExportProperties* pProperties) { std::string path = ""; std::string file = pFile; @@ -78,13 +78,19 @@ void ExportSceneXFile(const char* pFile,IOSystem* pIOSystem, const aiScene* pSce } } + // create/copy Properties + ExportProperties props(*pProperties); + + // set standard properties if not set + if (!props.HasPropertyBool(AI_CONFIG_EXPORT_XFILE_64BIT)) props.SetPropertyBool(AI_CONFIG_EXPORT_XFILE_64BIT, false); + // invoke the exporter - XFileExporter iDoTheExportThing( pScene, pIOSystem, path, file); + XFileExporter iDoTheExportThing( pScene, pIOSystem, path, file, &props); // we're still here - export successfully completed. Write result to the given IOSYstem boost::scoped_ptr outfile (pIOSystem->Open(pFile,"wt")); if(outfile == NULL) { - throw DeadlyExportError("could not open output .dae file: " + std::string(pFile)); + throw DeadlyExportError("could not open output .x file: " + std::string(pFile)); } // XXX maybe use a small wrapper around IOStream that behaves like std::stringstream in order to avoid the extra copy. @@ -96,7 +102,7 @@ void ExportSceneXFile(const char* pFile,IOSystem* pIOSystem, const aiScene* pSce // ------------------------------------------------------------------------------------------------ // Constructor for a specific scene to export -XFileExporter::XFileExporter(const aiScene* pScene, IOSystem* pIOSystem, const std::string& path, const std::string& file) : mIOSystem(pIOSystem), mPath(path), mFile(file) +XFileExporter::XFileExporter(const aiScene* pScene, IOSystem* pIOSystem, const std::string& path, const std::string& file, const ExportProperties* pProperties) : mIOSystem(pIOSystem), mPath(path), mFile(file), mProperties(pProperties) { // make sure that all formatting happens using the standard, C locale and not the user's current locale mOutput.imbue( std::locale("C") ); @@ -126,7 +132,7 @@ void XFileExporter::WriteFile() { // note, that all realnumber values must be comma separated in x files mOutput.setf(std::ios::fixed); - mOutput.precision(6); // precission for float + mOutput.precision(16); // precission for double // entry of writing the file WriteHeader(); @@ -148,7 +154,10 @@ void XFileExporter::WriteFile() // Writes the asset header void XFileExporter::WriteHeader() { - mOutput << startstr << "xof 0303txt 0032" << endstr; + if (mProperties->GetPropertyBool(AI_CONFIG_EXPORT_XFILE_64BIT) == true) + mOutput << startstr << "xof 0303txt 0064" << endstr; + else + mOutput << startstr << "xof 0303txt 0032" << endstr; mOutput << endstr; mOutput << startstr << "template Frame {" << endstr; PushTag(); @@ -298,7 +307,7 @@ void XFileExporter::WriteNode( aiNode* pNode) ss << "Node_" << pNode; pNode->mName.Set(ss.str()); } - mOutput << startstr << "Frame " << pNode->mName.C_Str() << " {" << endstr; + mOutput << startstr << "Frame " << toXFileString(pNode->mName) << " {" << endstr; PushTag(); @@ -318,9 +327,9 @@ void XFileExporter::WriteNode( aiNode* pNode) mOutput << startstr << "}" << endstr << endstr; } -void XFileExporter::WriteMesh(const aiMesh* mesh) +void XFileExporter::WriteMesh(aiMesh* mesh) { - mOutput << startstr << "Mesh " << mesh->mName.C_Str() << "_mShape" << " {" << endstr; + mOutput << startstr << "Mesh " << toXFileString(mesh->mName) << "_mShape" << " {" << endstr; PushTag(); @@ -496,6 +505,16 @@ void XFileExporter::WriteMesh(const aiMesh* mesh) } +std::string XFileExporter::toXFileString(aiString &name) +{ + std::string str = std::string(name.C_Str()); + std::replace(str.begin(), str.end(), '<', '_'); + std::replace(str.begin(), str.end(), '>', '_'); + std::replace(str.begin(), str.end(), '{', '_'); + std::replace(str.begin(), str.end(), '}', '_'); + std::replace(str.begin(), str.end(), '$', '_'); + return str; +} void XFileExporter::writePath(aiString path) { diff --git a/code/XFileExporter.h b/code/XFileExporter.h index fa4e6d38e..5c9f56701 100644 --- a/code/XFileExporter.h +++ b/code/XFileExporter.h @@ -61,7 +61,7 @@ class XFileExporter { public: /// Constructor for a specific scene to export - XFileExporter(const aiScene* pScene, IOSystem* pIOSystem, const std::string& path, const std::string& file); + XFileExporter(const aiScene* pScene, IOSystem* pIOSystem, const std::string& path, const std::string& file, const ExportProperties* pProperties); /// Destructor virtual ~XFileExporter(); @@ -80,7 +80,7 @@ protected: void WriteNode( aiNode* pNode ); /// write a mesh entry of the scene - void WriteMesh(const aiMesh* mesh); + void WriteMesh( aiMesh* mesh); /// Enters a new xml element, which increases the indentation void PushTag() { startstr.append( " "); } @@ -94,6 +94,12 @@ public: protected: + /// normalize the name to be accepted by xfile readers + std::string toXFileString(aiString &name); + + /// hold the properties pointer + const ExportProperties* mProperties; + /// write a path void writePath(aiString path); diff --git a/include/assimp/Exporter.hpp b/include/assimp/Exporter.hpp index 8ed98b3a2..692830f02 100644 --- a/include/assimp/Exporter.hpp +++ b/include/assimp/Exporter.hpp @@ -48,6 +48,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef ASSIMP_BUILD_NO_EXPORT #include "cexport.h" +#include namespace Assimp { class ExporterPimpl; @@ -72,6 +73,9 @@ namespace Assimp { * #ExportToBlob is especially useful if you intend to work * with the data in-memory. */ + +class ASSIMP_API ExportProperties; + class ASSIMP_API Exporter // TODO: causes good ol' base class has no dll interface warning //#ifdef __cplusplus @@ -81,7 +85,7 @@ class ASSIMP_API Exporter public: /** Function pointer type of a Export worker function */ - typedef void (*fpExportFunc)(const char*,IOSystem*, const aiScene*); + typedef void (*fpExportFunc)(const char*, IOSystem*, const aiScene*, const ExportProperties*); /** Internal description of an Assimp export format option */ struct ExportFormatEntry @@ -171,8 +175,8 @@ public: * Any IO handlers set via #SetIOHandler are ignored here. * @note Use aiCopyScene() to get a modifiable copy of a previously * imported scene. */ - const aiExportDataBlob* ExportToBlob( const aiScene* pScene, const char* pFormatId, unsigned int pPreprocessing = 0u ); - inline const aiExportDataBlob* ExportToBlob( const aiScene* pScene, const std::string& pFormatId, unsigned int pPreprocessing = 0u ); + const aiExportDataBlob* ExportToBlob( const aiScene* pScene, const char* pFormatId, unsigned int pPreprocessing = 0u, const ExportProperties* pProperties = NULL); + inline const aiExportDataBlob* ExportToBlob( const aiScene* pScene, const std::string& pFormatId, unsigned int pPreprocessing = 0u, const ExportProperties* pProperties = NULL); // ------------------------------------------------------------------- @@ -208,8 +212,8 @@ public: * @return AI_SUCCESS if everything was fine. * @note Use aiCopyScene() to get a modifiable copy of a previously * imported scene.*/ - aiReturn Export( const aiScene* pScene, const char* pFormatId, const char* pPath, unsigned int pPreprocessing = 0u); - inline aiReturn Export( const aiScene* pScene, const std::string& pFormatId, const std::string& pPath, unsigned int pPreprocessing = 0u); + aiReturn Export( const aiScene* pScene, const char* pFormatId, const char* pPath, unsigned int pPreprocessing = 0u, const ExportProperties* pProperties = NULL); + inline aiReturn Export( const aiScene* pScene, const std::string& pFormatId, const std::string& pPath, unsigned int pPreprocessing = 0u, const ExportProperties* pProperties = NULL); // ------------------------------------------------------------------- @@ -309,16 +313,188 @@ protected: }; -// ---------------------------------------------------------------------------------- -inline const aiExportDataBlob* Exporter :: ExportToBlob( const aiScene* pScene, const std::string& pFormatId,unsigned int pPreprocessing ) +class ASSIMP_API ExportProperties { - return ExportToBlob(pScene,pFormatId.c_str(),pPreprocessing); +public: + // Data type to store the key hash + typedef unsigned int KeyType; + + // typedefs for our four configuration maps. + // We don't need more, so there is no need for a generic solution + typedef std::map IntPropertyMap; + typedef std::map FloatPropertyMap; + typedef std::map StringPropertyMap; + typedef std::map MatrixPropertyMap; + +public: + + /** Standard constructor + * @see ExportProperties() + */ + + ExportProperties(); + + // ------------------------------------------------------------------- + /** Copy constructor. + * + * This copies the configuration properties of another ExportProperties. + * @see ExportProperties(const ExportProperties& other) + */ + ExportProperties(const ExportProperties& other); + + // ------------------------------------------------------------------- + /** Set an integer configuration property. + * @param szName Name of the property. All supported properties + * are defined in the aiConfig.g header (all constants share the + * prefix AI_CONFIG_XXX and are simple strings). + * @param iValue New value of the property + * @param bWasExisting Optional pointer to receive true if the + * property was set before. The new value replaces the previous value + * in this case. + * @note Property of different types (float, int, string ..) are kept + * on different stacks, so calling SetPropertyInteger() for a + * floating-point property has no effect - the loader will call + * GetPropertyFloat() to read the property, but it won't be there. + */ + void SetPropertyInteger(const char* szName, int iValue, + bool* bWasExisting = NULL); + + // ------------------------------------------------------------------- + /** Set a boolean configuration property. Boolean properties + * are stored on the integer stack internally so it's possible + * to set them via #SetPropertyBool and query them with + * #GetPropertyBool and vice versa. + * @see SetPropertyInteger() + */ + void SetPropertyBool(const char* szName, bool value, bool* bWasExisting = NULL) { + SetPropertyInteger(szName,value,bWasExisting); + } + + // ------------------------------------------------------------------- + /** Set a floating-point configuration property. + * @see SetPropertyInteger() + */ + void SetPropertyFloat(const char* szName, float fValue, + bool* bWasExisting = NULL); + + // ------------------------------------------------------------------- + /** Set a string configuration property. + * @see SetPropertyInteger() + */ + void SetPropertyString(const char* szName, const std::string& sValue, + bool* bWasExisting = NULL); + + // ------------------------------------------------------------------- + /** Set a matrix configuration property. + * @see SetPropertyInteger() + */ + void SetPropertyMatrix(const char* szName, const aiMatrix4x4& sValue, + bool* bWasExisting = NULL); + + // ------------------------------------------------------------------- + /** Get a configuration property. + * @param szName Name of the property. All supported properties + * are defined in the aiConfig.g header (all constants share the + * prefix AI_CONFIG_XXX). + * @param iErrorReturn Value that is returned if the property + * is not found. + * @return Current value of the property + * @note Property of different types (float, int, string ..) are kept + * on different lists, so calling SetPropertyInteger() for a + * floating-point property has no effect - the loader will call + * GetPropertyFloat() to read the property, but it won't be there. + */ + int GetPropertyInteger(const char* szName, + int iErrorReturn = 0xffffffff) const; + + // ------------------------------------------------------------------- + /** Get a boolean configuration property. Boolean properties + * are stored on the integer stack internally so it's possible + * to set them via #SetPropertyBool and query them with + * #GetPropertyBool and vice versa. + * @see GetPropertyInteger() + */ + bool GetPropertyBool(const char* szName, bool bErrorReturn = false) const { + return GetPropertyInteger(szName,bErrorReturn)!=0; + } + + // ------------------------------------------------------------------- + /** Get a floating-point configuration property + * @see GetPropertyInteger() + */ + float GetPropertyFloat(const char* szName, + float fErrorReturn = 10e10f) const; + + // ------------------------------------------------------------------- + /** Get a string configuration property + * + * The return value remains valid until the property is modified. + * @see GetPropertyInteger() + */ + const std::string GetPropertyString(const char* szName, + const std::string& sErrorReturn = "") const; + + // ------------------------------------------------------------------- + /** Get a matrix configuration property + * + * The return value remains valid until the property is modified. + * @see GetPropertyInteger() + */ + const aiMatrix4x4 GetPropertyMatrix(const char* szName, + const aiMatrix4x4& sErrorReturn = aiMatrix4x4()) const; + + // ------------------------------------------------------------------- + /** Determine a integer configuration property has been set. + * @see HasPropertyInteger() + */ + bool HasPropertyInteger(const char* szName) const; + + /** Determine a boolean configuration property has been set. + * @see HasPropertyBool() + */ + bool HasPropertyBool(const char* szName) const; + + /** Determine a boolean configuration property has been set. + * @see HasPropertyFloat() + */ + bool HasPropertyFloat(const char* szName) const; + + /** Determine a String configuration property has been set. + * @see HasPropertyString() + */ + bool HasPropertyString(const char* szName) const; + + /** Determine a Matrix configuration property has been set. + * @see HasPropertyMatrix() + */ + bool HasPropertyMatrix(const char* szName) const; + +protected: + + /** List of integer properties */ + IntPropertyMap mIntProperties; + + /** List of floating-point properties */ + FloatPropertyMap mFloatProperties; + + /** List of string properties */ + StringPropertyMap mStringProperties; + + /** List of Matrix properties */ + MatrixPropertyMap mMatrixProperties; +}; + + +// ---------------------------------------------------------------------------------- +inline const aiExportDataBlob* Exporter :: ExportToBlob( const aiScene* pScene, const std::string& pFormatId,unsigned int pPreprocessing, const ExportProperties* pProperties) +{ + return ExportToBlob(pScene,pFormatId.c_str(),pPreprocessing, pProperties); } // ---------------------------------------------------------------------------------- -inline aiReturn Exporter :: Export( const aiScene* pScene, const std::string& pFormatId, const std::string& pPath, unsigned int pPreprocessing ) +inline aiReturn Exporter :: Export( const aiScene* pScene, const std::string& pFormatId, const std::string& pPath, unsigned int pPreprocessing, const ExportProperties* pProperties) { - return Export(pScene,pFormatId.c_str(),pPath.c_str(),pPreprocessing); + return Export(pScene,pFormatId.c_str(),pPath.c_str(),pPreprocessing, pProperties); } } // namespace Assimp diff --git a/include/assimp/config.h b/include/assimp/config.h index abe3f1102..6b598f2a9 100644 --- a/include/assimp/config.h +++ b/include/assimp/config.h @@ -879,4 +879,15 @@ enum aiComponent #define AI_CONFIG_IMPORT_COLLADA_IGNORE_UP_DIRECTION "IMPORT_COLLADA_IGNORE_UP_DIRECTION" + +// ---------- All the Export defines ------------ + +/** @brief Specifies the xfile use double for real values of float + * + * Property type: Bool. Default value: false. + */ + +#define AI_CONFIG_EXPORT_XFILE_64BIT "EXPORT_XFILE_64BIT" + + #endif // !! AI_CONFIG_H_INC