Преглед изворни кода

Prototype unit system for assimp generic enough to be used across formats.

Gordon MacPherson пре 6 година
родитељ
комит
0d29203e24

+ 5 - 1
code/FBX/FBXImporter.cpp

@@ -189,8 +189,12 @@ void FBXImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOS
         if (settings.convertToMeters) {
         if (settings.convertToMeters) {
             unit = FbxUnit::m;
             unit = FbxUnit::m;
         }
         }
+
         // convert the FBX DOM to aiScene
         // convert the FBX DOM to aiScene
-        ConvertToAssimpScene(pScene,doc, settings.removeEmptyBones, unit);
+        ConvertToAssimpScene(pScene, doc, settings.removeEmptyBones, unit);
+        
+        // Set file scale relative to meters
+        SetFileScale( doc.GlobalSettings().UnitScaleFactor() );
 
 
         std::for_each(tokens.begin(),tokens.end(),Util::delete_fun<Token>());
         std::for_each(tokens.begin(),tokens.end(),Util::delete_fun<Token>());
     }
     }

+ 9 - 1
code/PostProcessing/ScaleProcess.cpp

@@ -43,7 +43,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
 #include <assimp/scene.h>
 #include <assimp/scene.h>
 #include <assimp/postprocess.h>
 #include <assimp/postprocess.h>
-
+#include <assimp/BaseImporter.h>
 
 
 namespace Assimp {
 namespace Assimp {
 
 
@@ -69,7 +69,15 @@ bool ScaleProcess::IsActive( unsigned int pFlags ) const {
 }
 }
 
 
 void ScaleProcess::SetupProperties( const Importer* pImp ) {
 void ScaleProcess::SetupProperties( const Importer* pImp ) {
+    // User scaling
     mScale = pImp->GetPropertyFloat( AI_CONFIG_GLOBAL_SCALE_FACTOR_KEY, 1.0f );
     mScale = pImp->GetPropertyFloat( AI_CONFIG_GLOBAL_SCALE_FACTOR_KEY, 1.0f );
+
+    // File scaling * Application Scaling
+    float importerScale = pImp->GetPropertyFloat( AI_CONFIG_APP_SCALE_KEY, 1.0f );
+
+    // apply scale to the scale 
+    // helps prevent bugs with backward compatibility for anyone using normal scaling.
+    mScale *= importerScale;
 }
 }
 
 
 void ScaleProcess::Execute( aiScene* pScene ) {
 void ScaleProcess::Execute( aiScene* pScene ) {

+ 61 - 1
include/assimp/BaseImporter.h

@@ -48,8 +48,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
 #include <vector>
 #include <vector>
 #include <set>
 #include <set>
+#include <map>
 #include <assimp/types.h>
 #include <assimp/types.h>
 #include <assimp/ProgressHandler.hpp>
 #include <assimp/ProgressHandler.hpp>
+#include <assimp/ai_assert.h>
 
 
 struct aiScene;
 struct aiScene;
 struct aiImporterDesc;
 struct aiImporterDesc;
@@ -161,14 +163,72 @@ public:
      *  some loader features. Importers must provide this information. */
      *  some loader features. Importers must provide this information. */
     virtual const aiImporterDesc* GetInfo() const = 0;
     virtual const aiImporterDesc* GetInfo() const = 0;
 
 
+    /**
+     * Will be called only by scale process when scaling is requested.
+     */
+    virtual void SetFileScale(double scale)
+    {
+        fileScale = scale;
+    }
+
+    virtual double GetFileScale() const
+    {
+        return fileScale;
+    }
+
+    enum ImporterUnits {
+        M,
+        MM,
+        CM,
+        INCHES,
+        FEET
+    };
+
+    /**
+     * Assimp Importer
+     * unit conversions available 
+     * if you need another measurment unit add it below.
+     * it's currently defined in assimp that we prefer meters.
+     * */
+    std::map<ImporterUnits, double> importerUnits = {
+        {ImporterUnits::M, 1},
+        {ImporterUnits::CM, 0.01},
+        {ImporterUnits::MM, 0.001},
+        {ImporterUnits::INCHES, 0.0254},
+        {ImporterUnits::FEET, 0.3048}
+    };
+
+    virtual void SetApplicationUnits( const ImporterUnits& unit )
+    {
+        importerScale = importerUnits[unit];
+        applicationUnits = unit;
+    }
+
+    virtual const ImporterUnits& GetApplicationUnits()
+    {
+        return applicationUnits;
+    }
+
+    /* Returns scale used by application called by ScaleProcess */
+    const double GetImporterScale()
+    {
+        ai_assert(importerScale != 0);
+        ai_assert(fileScale != 0);
+        return importerScale * fileScale;
+    }
+
     // -------------------------------------------------------------------
     // -------------------------------------------------------------------
     /** Called by #Importer::GetExtensionList for each loaded importer.
     /** Called by #Importer::GetExtensionList for each loaded importer.
      *  Take the extension list contained in the structure returned by
      *  Take the extension list contained in the structure returned by
      *  #GetInfo and insert all file extensions into the given set.
      *  #GetInfo and insert all file extensions into the given set.
      *  @param extension set to collect file extensions in*/
      *  @param extension set to collect file extensions in*/
     void GetExtensionList(std::set<std::string>& extensions);
     void GetExtensionList(std::set<std::string>& extensions);
+    
+protected:    
+    ImporterUnits applicationUnits = ImporterUnits::M;
+    double importerScale = 1.0;
+    double fileScale = 1.0;
 
 
-protected:
 
 
     // -------------------------------------------------------------------
     // -------------------------------------------------------------------
     /** Imports the given file into the given scene structure. The
     /** Imports the given file into the given scene structure. The

+ 7 - 0
include/assimp/config.h.in

@@ -999,6 +999,13 @@ enum aiComponent
 #   define AI_CONFIG_GLOBAL_SCALE_FACTOR_DEFAULT  1.0f
 #   define AI_CONFIG_GLOBAL_SCALE_FACTOR_DEFAULT  1.0f
 #endif // !! AI_DEBONE_THRESHOLD
 #endif // !! AI_DEBONE_THRESHOLD
 
 
+#define AI_CONFIG_APP_SCALE_KEY "APP_SCALE_FACTOR"
+
+#if (!defined AI_CONFIG_APP_SCALE_KEY)
+#   define AI_CONFIG_APP_SCALE_KEY 1.0
+#endif // AI_CONFIG_APP_SCALE_KEY
+
+
 // ---------- All the Build/Compile-time defines ------------
 // ---------- All the Build/Compile-time defines ------------
 
 
 /** @brief Specifies if double precision is supported inside assimp
 /** @brief Specifies if double precision is supported inside assimp