|
@@ -227,11 +227,47 @@ const aiExportDataBlob* Exporter :: ExportToBlob( const aiScene* pScene, const
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
+// ------------------------------------------------------------------------------------------------
|
|
|
|
+bool IsVerboseFormat(const aiMesh* mesh)
|
|
|
|
+{
|
|
|
|
+ // avoid slow vector<bool> specialization
|
|
|
|
+ std::vector<unsigned int> seen(mesh->mNumVertices,0);
|
|
|
|
+ for(unsigned int i = 0; i < mesh->mNumFaces; ++i) {
|
|
|
|
+ const aiFace& f = mesh->mFaces[i];
|
|
|
|
+ for(unsigned int j = 0; j < f.mNumIndices; ++j) {
|
|
|
|
+ if(++seen[f.mIndices[j]] == 2) {
|
|
|
|
+ // found a duplicate index
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+// ------------------------------------------------------------------------------------------------
|
|
|
|
+bool IsVerboseFormat(const aiScene* pScene)
|
|
|
|
+{
|
|
|
|
+ for(unsigned int i = 0; i < pScene->mNumMeshes; ++i) {
|
|
|
|
+ if(!IsVerboseFormat(pScene->mMeshes[i])) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
// ------------------------------------------------------------------------------------------------
|
|
// ------------------------------------------------------------------------------------------------
|
|
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 )
|
|
{
|
|
{
|
|
ASSIMP_BEGIN_EXCEPTION_REGION();
|
|
ASSIMP_BEGIN_EXCEPTION_REGION();
|
|
|
|
|
|
|
|
+ // when they create scenes from scratch, users will likely create them not in verbose
|
|
|
|
+ // 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);
|
|
|
|
+
|
|
pimpl->mError = "";
|
|
pimpl->mError = "";
|
|
for (size_t i = 0; i < pimpl->mExporters.size(); ++i) {
|
|
for (size_t i = 0; i < pimpl->mExporters.size(); ++i) {
|
|
const Exporter::ExportFormatEntry& exp = pimpl->mExporters[i];
|
|
const Exporter::ExportFormatEntry& exp = pimpl->mExporters[i];
|
|
@@ -266,7 +302,7 @@ aiReturn Exporter :: Export( const aiScene* pScene, const char* pFormatId, const
|
|
// 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.
|
|
bool must_join_again = false;
|
|
bool must_join_again = false;
|
|
- if (scenecopy->mFlags & AI_SCENE_FLAGS_NON_VERBOSE_FORMAT) {
|
|
|
|
|
|
+ if (!is_verbose_format) {
|
|
|
|
|
|
bool verbosify = false;
|
|
bool verbosify = false;
|
|
for( unsigned int a = 0; a < pimpl->mPostProcessingSteps.size(); a++) {
|
|
for( unsigned int a = 0; a < pimpl->mPostProcessingSteps.size(); a++) {
|