[Bf-blender-cvs] [047819e7280] master: Cleanup: Alembic, simplify material assignment code

Sybren A. Stüvel noreply at git.blender.org
Fri Nov 6 14:28:23 CET 2020


Commit: 047819e72805cdf34e5966453609b664e92a912f
Author: Sybren A. Stüvel
Date:   Fri Nov 6 13:09:08 2020 +0100
Branches: master
https://developer.blender.org/rB047819e72805cdf34e5966453609b664e92a912f

Cleanup: Alembic, simplify material assignment code

Refactor material assignment code such that:
- `build_mat_map()` just returns the built map (instead of relying on
  modifying a map passed as parameter),
- `LISTBASE_FOREACH` is used to loop over a `ListBase` (instead of a
  hand-crafted for-loop),
- just `return` when not enough material slots can be created (instead
  of setting a boolean to false, then doing some useless work, then
  checking the boolean),
- reorder some code for clarity, and
- rename `mat_map` to `matname_to_material` so that the semantics are
  clearer.

No functional changes.

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

M	source/blender/io/alembic/intern/abc_reader_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 28e42b1f70f..93520087d83 100644
--- a/source/blender/io/alembic/intern/abc_reader_mesh.cc
+++ b/source/blender/io/alembic/intern/abc_reader_mesh.cc
@@ -33,6 +33,7 @@
 #include "DNA_object_types.h"
 
 #include "BLI_compiler_compat.h"
+#include "BLI_listbase.h"
 #include "BLI_math_geom.h"
 
 #include "BKE_main.h"
@@ -70,55 +71,44 @@ namespace blender::io::alembic {
 /* Some helpers for mesh generation */
 namespace utils {
 
-static void build_mat_map(const Main *bmain, std::map<std::string, Material *> &mat_map)
+static std::map<std::string, Material *> build_material_map(const Main *bmain)
 {
-  Material *material = static_cast<Material *>(bmain->materials.first);
-
-  for (; material; material = static_cast<Material *>(material->id.next)) {
+  std::map<std::string, Material *> mat_map;
+  LISTBASE_FOREACH (Material *, material, &bmain->materials) {
     mat_map[material->id.name + 2] = material;
   }
+  return mat_map;
 }
 
 static void assign_materials(Main *bmain,
                              Object *ob,
                              const std::map<std::string, int> &mat_index_map)
 {
-  bool can_assign = true;
-  std::map<std::string, int>::const_iterator it = mat_index_map.begin();
-
-  int matcount = 0;
-  for (; it != mat_index_map.end(); ++it, matcount++) {
+  std::map<std::string, int>::const_iterator it;
+  for (it = mat_index_map.begin(); it != mat_index_map.end(); ++it) {
     if (!BKE_object_material_slot_add(bmain, ob)) {
-      can_assign = false;
-      break;
+      return;
     }
   }
 
-  /* TODO(kevin): use global map? */
-  std::map<std::string, Material *> mat_map;
-  build_mat_map(bmain, mat_map);
-
+  std::map<std::string, Material *> matname_to_material = build_material_map(bmain);
   std::map<std::string, Material *>::iterator mat_iter;
 
-  if (can_assign) {
-    it = mat_index_map.begin();
-
-    for (; it != mat_index_map.end(); ++it) {
-      std::string mat_name = it->first;
-      mat_iter = mat_map.find(mat_name);
+  for (it = mat_index_map.begin(); it != mat_index_map.end(); ++it) {
+    const std::string mat_name = it->first;
+    const int mat_index = it->second;
 
-      Material *assigned_mat;
-
-      if (mat_iter == mat_map.end()) {
-        assigned_mat = BKE_material_add(bmain, mat_name.c_str());
-        mat_map[mat_name] = assigned_mat;
-      }
-      else {
-        assigned_mat = mat_iter->second;
-      }
-
-      BKE_object_material_assign(bmain, ob, assigned_mat, it->second, BKE_MAT_ASSIGN_OBDATA);
+    Material *assigned_mat;
+    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());
+      matname_to_material[mat_name] = assigned_mat;
+    }
+    else {
+      assigned_mat = mat_iter->second;
     }
+
+    BKE_object_material_assign(bmain, ob, assigned_mat, mat_index, BKE_MAT_ASSIGN_OBDATA);
   }
 }



More information about the Bf-blender-cvs mailing list