[Bf-blender-cvs] [f366d197db2] blender-v3.3-release: Fix T100737: OBJ/USD import: imported object has no active material, material has 2 users

Aras Pranckevicius noreply at git.blender.org
Thu Sep 1 19:39:06 CEST 2022


Commit: f366d197db24cf611866a8d847b4022a6a46504e
Author: Aras Pranckevicius
Date:   Thu Sep 1 20:38:56 2022 +0300
Branches: blender-v3.3-release
https://developer.blender.org/rBf366d197db24cf611866a8d847b4022a6a46504e

Fix T100737: OBJ/USD import: imported object has no active material, material has 2 users

Fixes issues in importers written in C++ (T100737):

- Materials had one reference count too much. Affected Collada,
  Alembic, USD, OBJ importers, looks like "since forever".
- Active material index was not properly set on imported meshes.
  Regression since 3.3 (D15145). Affected Alembic, USD, OBJ. Note:
  now it sets the first material as the active one, whereas
  previously the last one was set as active. First one sounds more
  "intuitive" to me.

Reviewed By: Bastien Montagne
Differential Revision: https://developer.blender.org/D15831

===================================================================

M	source/blender/io/alembic/intern/abc_reader_mesh.cc
M	source/blender/io/collada/DocumentImporter.cpp
M	source/blender/io/usd/intern/usd_reader_material.cc
M	source/blender/io/usd/intern/usd_reader_mesh.cc
M	source/blender/io/wavefront_obj/importer/obj_import_mesh.cc

===================================================================

diff --git a/source/blender/io/alembic/intern/abc_reader_mesh.cc b/source/blender/io/alembic/intern/abc_reader_mesh.cc
index bacc1f06599..5b68b80b181 100644
--- a/source/blender/io/alembic/intern/abc_reader_mesh.cc
+++ b/source/blender/io/alembic/intern/abc_reader_mesh.cc
@@ -26,6 +26,7 @@
 #include "BLI_math_geom.h"
 
 #include "BKE_attribute.h"
+#include "BKE_lib_id.h"
 #include "BKE_main.h"
 #include "BKE_material.h"
 #include "BKE_mesh.h"
@@ -93,6 +94,7 @@ static void assign_materials(Main *bmain,
     mat_iter = matname_to_material.find(mat_name);
     if (mat_iter == matname_to_material.end()) {
       assigned_mat = BKE_material_add(bmain, mat_name.c_str());
+      id_us_min(&assigned_mat->id);
       matname_to_material[mat_name] = assigned_mat;
     }
     else {
@@ -101,6 +103,9 @@ static void assign_materials(Main *bmain,
 
     BKE_object_material_assign_single_obdata(bmain, ob, assigned_mat, mat_index);
   }
+  if (ob->totcol > 0) {
+    ob->actcol = 1;
+  }
 }
 
 } /* namespace utils */
diff --git a/source/blender/io/collada/DocumentImporter.cpp b/source/blender/io/collada/DocumentImporter.cpp
index 2ce97bc8b5d..1ffe412b3ed 100644
--- a/source/blender/io/collada/DocumentImporter.cpp
+++ b/source/blender/io/collada/DocumentImporter.cpp
@@ -743,6 +743,7 @@ bool DocumentImporter::writeMaterial(const COLLADAFW::Material *cmat)
   const std::string &str_mat_id = cmat->getName().empty() ? cmat->getOriginalId() :
                                                             cmat->getName();
   Material *ma = BKE_material_add(bmain, (char *)str_mat_id.c_str());
+  id_us_min(&ma->id);
 
   this->uid_effect_map[cmat->getInstantiatedEffect()] = ma;
   this->uid_material_map[cmat->getUniqueId()] = ma;
diff --git a/source/blender/io/usd/intern/usd_reader_material.cc b/source/blender/io/usd/intern/usd_reader_material.cc
index 8feceee55ed..52addfeb418 100644
--- a/source/blender/io/usd/intern/usd_reader_material.cc
+++ b/source/blender/io/usd/intern/usd_reader_material.cc
@@ -4,6 +4,7 @@
 #include "usd_reader_material.h"
 
 #include "BKE_image.h"
+#include "BKE_lib_id.h"
 #include "BKE_main.h"
 #include "BKE_material.h"
 #include "BKE_node.h"
@@ -266,6 +267,7 @@ Material *USDMaterialReader::add_material(const pxr::UsdShadeMaterial &usd_mater
 
   /* Create the material. */
   Material *mtl = BKE_material_add(bmain_, mtl_name.c_str());
+  id_us_min(&mtl->id);
 
   /* Get the UsdPreviewSurface shader source for the material,
    * if there is one. */
diff --git a/source/blender/io/usd/intern/usd_reader_mesh.cc b/source/blender/io/usd/intern/usd_reader_mesh.cc
index 45657525527..de638b0a837 100644
--- a/source/blender/io/usd/intern/usd_reader_mesh.cc
+++ b/source/blender/io/usd/intern/usd_reader_mesh.cc
@@ -168,6 +168,9 @@ static void assign_materials(Main *bmain,
       std::cout << "WARNING: Couldn't assign material " << it->first << std::endl;
     }
   }
+  if (ob->totcol > 0) {
+    ob->actcol = 1;
+  }
 }
 
 }  // namespace utils
diff --git a/source/blender/io/wavefront_obj/importer/obj_import_mesh.cc b/source/blender/io/wavefront_obj/importer/obj_import_mesh.cc
index a570b374231..6b19d6573af 100644
--- a/source/blender/io/wavefront_obj/importer/obj_import_mesh.cc
+++ b/source/blender/io/wavefront_obj/importer/obj_import_mesh.cc
@@ -296,6 +296,8 @@ static Material *get_or_create_material(Main *bmain,
   const MTLMaterial &mtl = *materials.lookup_or_add(name, std::make_unique<MTLMaterial>());
 
   Material *mat = BKE_material_add(bmain, name.c_str());
+  id_us_min(&mat->id);
+
   ShaderNodetreeWrap mat_wrap{bmain, mtl, mat, relative_paths};
   mat->use_nodes = true;
   mat->nodetree = mat_wrap.get_nodetree();
@@ -319,6 +321,9 @@ void MeshFromGeometry::create_materials(Main *bmain,
     }
     BKE_object_material_assign_single_obdata(bmain, obj, mat, obj->totcol + 1);
   }
+  if (obj->totcol > 0) {
+    obj->actcol = 1;
+  }
 }
 
 void MeshFromGeometry::create_normals(Mesh *mesh)



More information about the Bf-blender-cvs mailing list