瀏覽代碼

Merge branch 'master' of github.com:assimp/assimp

acgessler 12 年之前
父節點
當前提交
7a4edbd126
共有 5 個文件被更改,包括 27 次插入5 次删除
  1. 1 0
      code/AssimpCExport.cpp
  2. 5 4
      code/Exporter.cpp
  3. 8 0
      code/ScenePrivate.h
  4. 7 1
      include/assimp/Exporter.hpp
  5. 6 0
      include/assimp/cexport.h

+ 1 - 0
code/AssimpCExport.cpp

@@ -73,6 +73,7 @@ ASSIMP_API void aiCopyScene(const aiScene* pIn, aiScene** pOut)
 	}
 	}
 
 
 	SceneCombiner::CopyScene(pOut,pIn,true);
 	SceneCombiner::CopyScene(pOut,pIn,true);
+	ScenePriv(*pOut)->mIsCopy = true;
 }
 }
 
 
 
 

+ 5 - 4
code/Exporter.cpp

@@ -289,15 +289,16 @@ aiReturn Exporter :: Export( const aiScene* pScene, const char* pFormatId, const
 				const unsigned int nonIdempotentSteps = aiProcess_FlipWindingOrder | aiProcess_FlipUVs | aiProcess_MakeLeftHanded;
 				const unsigned int nonIdempotentSteps = aiProcess_FlipWindingOrder | aiProcess_FlipUVs | aiProcess_MakeLeftHanded;
 
 
 				// Erase all pp steps that were already applied to this scene
 				// Erase all pp steps that were already applied to this scene
-				unsigned int pp = (exp.mEnforcePP | pPreprocessing) & ~(priv 
+				const unsigned int pp = (exp.mEnforcePP | pPreprocessing) & ~(priv && !priv->mIsCopy
 					? (priv->mPPStepsApplied & ~nonIdempotentSteps)
 					? (priv->mPPStepsApplied & ~nonIdempotentSteps)
 					: 0u);
 					: 0u);
 
 
 				// If no extra postprocessing was specified, and we obtained this scene from an
 				// If no extra postprocessing was specified, and we obtained this scene from an
 				// Assimp importer, apply the reverse steps automatically.
 				// Assimp importer, apply the reverse steps automatically.
-				if (!pPreprocessing && priv) {
-					pp |= (nonIdempotentSteps & priv->mPPStepsApplied);
-				}
+				// TODO: either drop this, or document it. Otherwise it is just a bad surprise.
+				//if (!pPreprocessing && priv) {
+				//	pp |= (nonIdempotentSteps & priv->mPPStepsApplied);
+				//}
 
 
 				// If the input scene is not in verbose format, but there is at least postprocessing step that relies on it,
 				// If the input scene is not in verbose format, but there is at least postprocessing step that relies on it,
 				// we need to run the MakeVerboseFormat step first.
 				// we need to run the MakeVerboseFormat step first.

+ 8 - 0
code/ScenePrivate.h

@@ -53,6 +53,7 @@ struct ScenePrivateData {
 	ScenePrivateData()
 	ScenePrivateData()
 		: mOrigImporter()
 		: mOrigImporter()
 		, mPPStepsApplied()
 		, mPPStepsApplied()
+		, mIsCopy()
 	{}
 	{}
 
 
 	// Importer that originally loaded the scene though the C-API
 	// Importer that originally loaded the scene though the C-API
@@ -61,6 +62,13 @@ struct ScenePrivateData {
 
 
 	// List of postprocessing steps already applied to the scene.
 	// List of postprocessing steps already applied to the scene.
 	unsigned int mPPStepsApplied;
 	unsigned int mPPStepsApplied;
+
+	// true if the scene is a copy made with aiCopyScene()
+	// or the corresponding C++ API. This means that user code
+	// may have made modifications to it, so mPPStepsApplied
+	// and mOrigImporter are no longer safe to rely on and only
+	// serve informative purposes.
+	bool mIsCopy;
 };
 };
 
 
 // Access private data stored in the scene
 // Access private data stored in the scene

+ 7 - 1
include/assimp/Exporter.hpp

@@ -198,7 +198,13 @@ public:
 	 *   redundant as exporters would apply them anyhow. A good example 
 	 *   redundant as exporters would apply them anyhow. A good example 
 	 *   is triangulation - whilst you can enforce it by specifying
 	 *   is triangulation - whilst you can enforce it by specifying
 	 *   the #aiProcess_Triangulate flag, most export formats support only
 	 *   the #aiProcess_Triangulate flag, most export formats support only
-	 *  triangulate data so they would run the step even if it wasn't requested.
+	 *   triangulate data so they would run the step even if it wasn't requested.
+	 *
+	 *   If assimp detects that the input scene was directly taken from the importer side of 
+     *   the library (i.e. not copied using aiCopyScene and potetially modified afterwards), 
+     *   any postprocessing steps already applied to the scene will not be applied again, unless
+     *   they show non-idempotent behaviour (#aiProcess_MakeLeftHanded, #aiProcess_FlipUVs and 
+     *   #aiProcess_FlipWindingOrder).
 	 * @return AI_SUCCESS if everything was fine. 
 	 * @return AI_SUCCESS if everything was fine. 
 	 * @note Use aiCopyScene() to get a modifiable copy of a previously
 	 * @note Use aiCopyScene() to get a modifiable copy of a previously
 	 *   imported scene.*/
 	 *   imported scene.*/

+ 6 - 0
include/assimp/cexport.h

@@ -143,6 +143,12 @@ ASSIMP_API void aiFreeScene(const C_STRUCT aiScene* pIn);
 *   is triangulation - whilst you can enforce it by specifying
 *   is triangulation - whilst you can enforce it by specifying
 *   the #aiProcess_Triangulate flag, most export formats support only
 *   the #aiProcess_Triangulate flag, most export formats support only
 *   triangulate data so they would run the step anyway.
 *   triangulate data so they would run the step anyway.
+*
+*   If assimp detects that the input scene was directly taken from the importer side of 
+*   the library (i.e. not copied using aiCopyScene and potetially modified afterwards), 
+*   any postprocessing steps already applied to the scene will not be applied again, unless
+*   they show non-idempotent behaviour (#aiProcess_MakeLeftHanded, #aiProcess_FlipUVs and 
+*   #aiProcess_FlipWindingOrder).
 * @return a status code indicating the result of the export
 * @return a status code indicating the result of the export
 * @note Use aiCopyScene() to get a modifiable copy of a previously
 * @note Use aiCopyScene() to get a modifiable copy of a previously
 *   imported scene.
 *   imported scene.