Przeglądaj źródła

Closes https://github.com/assimp/assimp/issues/2251: introduce AI_CONFIG_PP_FID_IGNORE_TEXTURECOORDS to avoid removing textures.

Kim Kulling 6 lat temu
rodzic
commit
5d6fc7a557

+ 22 - 16
code/FindInvalidDataProcess.cpp

@@ -51,6 +51,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 // internal headers
 #include "FindInvalidDataProcess.h"
 #include "ProcessHelper.h"
+
 #include <assimp/Macros.h>
 #include <assimp/Exceptional.h>
 #include <assimp/qnan.h>
@@ -60,8 +61,8 @@ using namespace Assimp;
 // ------------------------------------------------------------------------------------------------
 // Constructor to be privately used by Importer
 FindInvalidDataProcess::FindInvalidDataProcess()
-    : configEpsilon(0.0)
-{
+: configEpsilon(0.0)
+, mIgnoreTexCoods( false ){
     // nothing to do here
 }
 
@@ -85,6 +86,7 @@ void FindInvalidDataProcess::SetupProperties(const Importer* pImp)
 {
     // Get the current value of AI_CONFIG_PP_FID_ANIM_ACCURACY
     configEpsilon = (0 != pImp->GetPropertyFloat(AI_CONFIG_PP_FID_ANIM_ACCURACY,0.f));
+    mIgnoreTexCoods = pImp->GetPropertyBool(AI_CONFIG_PP_FID_IGNORE_TEXTURECOORDS, false);
 }
 
 // ------------------------------------------------------------------------------------------------
@@ -171,7 +173,8 @@ void FindInvalidDataProcess::Execute( aiScene* pScene)
 
 // ------------------------------------------------------------------------------------------------
 template <typename T>
-inline const char* ValidateArrayContents(const T* /*arr*/, unsigned int /*size*/,
+inline
+const char* ValidateArrayContents(const T* /*arr*/, unsigned int /*size*/,
     const std::vector<bool>& /*dirtyMask*/, bool /*mayBeIdentical = false*/, bool /*mayBeZero = true*/)
 {
     return NULL;
@@ -179,7 +182,8 @@ inline const char* ValidateArrayContents(const T* /*arr*/, unsigned int /*size*/
 
 // ------------------------------------------------------------------------------------------------
 template <>
-inline const char* ValidateArrayContents<aiVector3D>(const aiVector3D* arr, unsigned int size,
+inline
+const char* ValidateArrayContents<aiVector3D>(const aiVector3D* arr, unsigned int size,
     const std::vector<bool>& dirtyMask, bool mayBeIdentical , bool mayBeZero )
 {
     bool b = false;
@@ -251,8 +255,8 @@ bool EpsilonCompare<aiQuatKey>(const aiQuatKey& n, const aiQuatKey& s, ai_real e
 
 // ------------------------------------------------------------------------------------------------
 template <typename T>
-inline bool AllIdentical(T* in, unsigned int num, ai_real epsilon)
-{
+inline
+bool AllIdentical(T* in, unsigned int num, ai_real epsilon) {
     if (num <= 1) {
         return true;
     }
@@ -361,17 +365,19 @@ int FindInvalidDataProcess::ProcessMesh (aiMesh* pMesh)
 
     // process texture coordinates
     for (unsigned int i = 0; i < AI_MAX_NUMBER_OF_TEXTURECOORDS && pMesh->mTextureCoords[i]; ++i) {
-        if (ProcessArray(pMesh->mTextureCoords[i], pMesh->mNumVertices, "uvcoords", dirtyMask)) {
-            pMesh->mNumUVComponents[i] = 0;
-
-            // delete all subsequent texture coordinate sets.
-            for (unsigned int a = i + 1; a < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++a) {
-                delete[] pMesh->mTextureCoords[a];
-                pMesh->mTextureCoords[a] = NULL;
-                pMesh->mNumUVComponents[a] = 0;
-            }
+        if (!mIgnoreTexCoods) {
+            if (ProcessArray(pMesh->mTextureCoords[i], pMesh->mNumVertices, "uvcoords", dirtyMask)) {
+                pMesh->mNumUVComponents[i] = 0;
+
+                // delete all subsequent texture coordinate sets.
+                for (unsigned int a = i + 1; a < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++a) {
+                    delete[] pMesh->mTextureCoords[a];
+                    pMesh->mTextureCoords[a] = NULL;
+                    pMesh->mNumUVComponents[a] = 0;
+                }
 
-            ret = true;
+                ret = true;
+            }
         }
     }
 

+ 9 - 11
code/FindInvalidDataProcess.h

@@ -41,7 +41,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
 /** @file Defines a post processing step to search an importer's output
-    for data that is obviously invalid  */
+ *   for data that is obviously invalid
+ */
 #ifndef AI_FINDINVALIDDATA_H_INC
 #define AI_FINDINVALIDDATA_H_INC
 
@@ -50,7 +51,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #include <assimp/anim.h>
 
 struct aiMesh;
+
 class FindInvalidDataProcessTest;
+
 namespace Assimp    {
 
 // ---------------------------------------------------------------------------
@@ -59,15 +62,11 @@ namespace Assimp    {
  *
  *  Originally this was a workaround for some models written by Blender
  *  which have zero normal vectors. */
-class ASSIMP_API FindInvalidDataProcess : public BaseProcess
-{
+class ASSIMP_API FindInvalidDataProcess : public BaseProcess {
 public:
-
     FindInvalidDataProcess();
     ~FindInvalidDataProcess();
 
-public:
-
     // -------------------------------------------------------------------
     //
     bool IsActive( unsigned int pFlags) const;
@@ -80,26 +79,25 @@ public:
     // Run the step
     void Execute( aiScene* pScene);
 
-public:
-
     // -------------------------------------------------------------------
-    /** Executes the postprocessing step on the given mesh
+    /** Executes the post-processing step on the given mesh
      * @param pMesh The mesh to process.
      * @return 0 - nothing, 1 - removed sth, 2 - please delete me  */
     int ProcessMesh( aiMesh* pMesh);
 
     // -------------------------------------------------------------------
-    /** Executes the postprocessing step on the given animation
+    /** Executes the post-processing step on the given animation
      * @param anim The animation to process.  */
     void ProcessAnimation (aiAnimation* anim);
 
     // -------------------------------------------------------------------
-    /** Executes the postprocessing step on the given anim channel
+    /** Executes the post-processing step on the given anim channel
      * @param anim The animation channel to process.*/
     void ProcessAnimationChannel (aiNodeAnim* anim);
 
 private:
     ai_real configEpsilon;
+    bool mIgnoreTexCoods;
 };
 
 } // end of namespace Assimp

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

@@ -498,6 +498,13 @@ enum aiComponent
 #define AI_CONFIG_PP_FID_ANIM_ACCURACY              \
     "PP_FID_ANIM_ACCURACY"
 
+// ---------------------------------------------------------------------------
+/** @brief Input parameter to the #aiProcess_FindInvalidData step:
+ *  Set to true to ignore texture coordinates. This may be useful if you have
+ *  to assign different kind of textures like one for the summer or one for the winter.
+ */
+#define AI_CONFIG_PP_FID_IGNORE_TEXTURECOORDS        \
+    "PP_FID_IGNORE_TEXTURECOORDS"
 
 // TransformUVCoords evaluates UV scalings
 #define AI_UVTRAFO_SCALING 0x1