Browse Source

Add configuration of text format precision

Define ASSIMP_AI_REAL_TEXT_PRECISION
8 when ai_real is float
16 when ai_real is double
RichardTea 6 years ago
parent
commit
bf252c4452

+ 1 - 1
code/Collada/ColladaExporter.cpp

@@ -99,7 +99,7 @@ ColladaExporter::ColladaExporter( const aiScene* pScene, IOSystem* pIOSystem, co
 , mFile(file) {
     // make sure that all formatting happens using the standard, C locale and not the user's current locale
     mOutput.imbue( std::locale("C") );
-    mOutput.precision(16);
+    mOutput.precision(ASSIMP_AI_REAL_TEXT_PRECISION);
 
     mScene = pScene;
     mSceneOwned = false;

+ 2 - 2
code/Obj/ObjExporter.cpp

@@ -126,9 +126,9 @@ ObjExporter::ObjExporter(const char* _filename, const aiScene* pScene, bool noMt
     // make sure that all formatting happens using the standard, C locale and not the user's current locale
     const std::locale& l = std::locale("C");
     mOutput.imbue(l);
-    mOutput.precision(16);
+    mOutput.precision(ASSIMP_AI_REAL_TEXT_PRECISION);
     mOutputMat.imbue(l);
-    mOutputMat.precision(16);
+    mOutputMat.precision(ASSIMP_AI_REAL_TEXT_PRECISION);
 
     WriteGeometryFile(noMtl);
     if ( !noMtl ) {

+ 1 - 1
code/Ply/PlyExporter.cpp

@@ -111,7 +111,7 @@ PlyExporter::PlyExporter(const char* _filename, const aiScene* pScene, bool bina
     // make sure that all formatting happens using the standard, C locale and not the user's current locale
     const std::locale& l = std::locale("C");
     mOutput.imbue(l);
-    mOutput.precision(16);
+    mOutput.precision(ASSIMP_AI_REAL_TEXT_PRECISION);
 
     unsigned int faces = 0u, vertices = 0u, components = 0u;
     for (unsigned int i = 0; i < pScene->mNumMeshes; ++i) {

+ 1 - 1
code/STL/STLExporter.cpp

@@ -111,7 +111,7 @@ STLExporter::STLExporter(const char* _filename, const aiScene* pScene, bool expo
     // make sure that all formatting happens using the standard, C locale and not the user's current locale
     const std::locale& l = std::locale("C");
     mOutput.imbue(l);
-    mOutput.precision(16);
+    mOutput.precision(ASSIMP_AI_REAL_TEXT_PRECISION);
     if (binary) {
         char buf[80] = {0} ;
         buf[0] = 'A'; buf[1] = 's'; buf[2] = 's'; buf[3] = 'i'; buf[4] = 'm'; buf[5] = 'p';

+ 8 - 8
code/Step/StepExporter.cpp

@@ -143,15 +143,15 @@ namespace {
 // ------------------------------------------------------------------------------------------------
 // Constructor for a specific scene to export
 StepExporter::StepExporter(const aiScene* pScene, IOSystem* pIOSystem, const std::string& path,
-		const std::string& file, const ExportProperties* pProperties):
-				 mProperties(pProperties),mIOSystem(pIOSystem),mFile(file), mPath(path),
-				 mScene(pScene), endstr(";\n") {
-	CollectTrafos(pScene->mRootNode, trafos);
-	CollectMeshes(pScene->mRootNode, meshes);
+    const std::string& file, const ExportProperties* pProperties) :
+    mProperties(pProperties), mIOSystem(pIOSystem), mFile(file), mPath(path),
+    mScene(pScene), endstr(";\n") {
+    CollectTrafos(pScene->mRootNode, trafos);
+    CollectMeshes(pScene->mRootNode, meshes);
 
     // make sure that all formatting happens using the standard, C locale and not the user's current locale
-    mOutput.imbue( std::locale("C") );
-    mOutput.precision(16);
+    mOutput.imbue(std::locale("C"));
+    mOutput.precision(ASSIMP_AI_REAL_TEXT_PRECISION);
 
     // start writing
     WriteFile();
@@ -166,7 +166,7 @@ void StepExporter::WriteFile()
     mOutput.setf(std::ios::fixed);
     // precision for double
     // see http://stackoverflow.com/questions/554063/how-do-i-print-a-double-value-with-full-precision-using-cout
-    mOutput.precision(16);
+    mOutput.precision(ASSIMP_AI_REAL_TEXT_PRECISION);
 
     // standard color
     aiColor4D fColor;

+ 2 - 2
code/X/XFileExporter.cpp

@@ -113,7 +113,7 @@ XFileExporter::XFileExporter(const aiScene* pScene, IOSystem* pIOSystem, const s
 {
     // make sure that all formatting happens using the standard, C locale and not the user's current locale
     mOutput.imbue( std::locale("C") );
-    mOutput.precision(16);
+    mOutput.precision(ASSIMP_AI_REAL_TEXT_PRECISION);
 
     // start writing
     WriteFile();
@@ -134,7 +134,7 @@ void XFileExporter::WriteFile()
 {
     // note, that all realnumber values must be comma separated in x files
     mOutput.setf(std::ios::fixed);
-    mOutput.precision(16); // precision for double
+    mOutput.precision(ASSIMP_AI_REAL_TEXT_PRECISION); // precision for ai_real
 
     // entry of writing the file
     WriteHeader();

+ 6 - 0
include/assimp/defs.h

@@ -243,10 +243,16 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     typedef double ai_real;
     typedef signed long long int ai_int;
     typedef unsigned long long int ai_uint;
+#ifndef ASSIMP_AI_REAL_TEXT_PRECISION
+#define ASSIMP_AI_REAL_TEXT_PRECISION 16
+#endif // ASSIMP_AI_REAL_TEXT_PRECISION
 #else // ASSIMP_DOUBLE_PRECISION
     typedef float ai_real;
     typedef signed int ai_int;
     typedef unsigned int ai_uint;
+#ifndef ASSIMP_AI_REAL_TEXT_PRECISION
+#define ASSIMP_AI_REAL_TEXT_PRECISION 8
+#endif // ASSIMP_AI_REAL_TEXT_PRECISION
 #endif // ASSIMP_DOUBLE_PRECISION
 
     //////////////////////////////////////////////////////////////////////////