[Bf-blender-cvs] [ef2bba87475] temp-modifiers-instancing: restructure depsgraph object iterator

Jacques Lucke noreply at git.blender.org
Wed Nov 11 16:09:30 CET 2020


Commit: ef2bba87475843e7b4ffe181c8d08957d9304ebc
Author: Jacques Lucke
Date:   Wed Nov 11 15:54:55 2020 +0100
Branches: temp-modifiers-instancing
https://developer.blender.org/rBef2bba87475843e7b4ffe181c8d08957d9304ebc

restructure depsgraph object iterator

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

M	source/blender/depsgraph/DEG_depsgraph_query.h
M	source/blender/depsgraph/intern/depsgraph_query_iter.cc

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

diff --git a/source/blender/depsgraph/DEG_depsgraph_query.h b/source/blender/depsgraph/DEG_depsgraph_query.h
index 2877c378e5f..a0db520b4cb 100644
--- a/source/blender/depsgraph/DEG_depsgraph_query.h
+++ b/source/blender/depsgraph/DEG_depsgraph_query.h
@@ -147,9 +147,8 @@ typedef struct DEGObjectIterData {
   eEvaluationMode eval_mode;
 
   /* **** Iteration over geometry components **** */
-  struct Object *geometry_set_owner;
-  struct GeometrySetC *geometry_set_c;
-  int next_geometry_set_component;
+  struct Object *geometry_component_owner;
+  int geometry_component_id;
   struct Object temp_geometry_component_object;
 
   /* **** Iteration over dupli-list. *** */
diff --git a/source/blender/depsgraph/intern/depsgraph_query_iter.cc b/source/blender/depsgraph/intern/depsgraph_query_iter.cc
index dad36260da1..ed844ecfcd4 100644
--- a/source/blender/depsgraph/intern/depsgraph_query_iter.cc
+++ b/source/blender/depsgraph/intern/depsgraph_query_iter.cc
@@ -123,9 +123,66 @@ bool deg_object_hide_original(eEvaluationMode eval_mode, Object *ob, DupliObject
   return false;
 }
 
-bool deg_objects_dupli_iterator_next(BLI_Iterator *iter)
+bool deg_iterator_components_step(BLI_Iterator *iter)
 {
   DEGObjectIterData *data = (DEGObjectIterData *)iter->data;
+  if (data->geometry_component_owner == nullptr) {
+    return false;
+  }
+
+  if (data->geometry_component_owner->type != OB_POINTCLOUD) {
+    /* Only point clouds support multiple geometry components currently. */
+    iter->current = data->geometry_component_owner;
+    data->geometry_component_owner = nullptr;
+    return true;
+  }
+
+  bke::GeometrySet *geometry_set = bke::unwrap(
+      data->geometry_component_owner->runtime.geometry_set_eval);
+  if (geometry_set == nullptr) {
+    data->geometry_component_owner = nullptr;
+    return false;
+  }
+
+  if (data->geometry_component_id == 0) {
+    data->geometry_component_id++;
+
+    /* The mesh component. */
+    const Mesh *mesh = geometry_set->get_mesh_for_read();
+    if (mesh != nullptr) {
+      Object *temp_object = &data->temp_geometry_component_object;
+      *temp_object = *data->geometry_component_owner;
+      temp_object->type = OB_MESH;
+      temp_object->data = (void *)mesh;
+      iter->current = temp_object;
+      return true;
+    }
+  }
+  if (data->geometry_component_id == 1) {
+    data->geometry_component_id++;
+
+    /* The pointcloud component. */
+    const PointCloud *pointcloud = geometry_set->get_pointcloud_for_read();
+    if (pointcloud != nullptr) {
+      Object *temp_object = &data->temp_geometry_component_object;
+      *temp_object = *data->geometry_component_owner;
+      temp_object->type = OB_POINTCLOUD;
+      temp_object->data = (void *)pointcloud;
+      iter->current = temp_object;
+      return true;
+    }
+  }
+  data->geometry_component_owner = nullptr;
+  return false;
+}
+
+/* Returns false when iterator is exhausted. */
+bool deg_iterator_duplis_step(DEGObjectIterData *data)
+{
+  if (data->dupli_list == nullptr) {
+    return false;
+  }
+
   while (data->dupli_object_next != nullptr) {
     DupliObject *dob = data->dupli_object_next;
     Object *obd = dob->ob;
@@ -172,81 +229,87 @@ bool deg_objects_dupli_iterator_next(BLI_Iterator *iter)
 
     copy_m4_m4(data->temp_dupli_object.obmat, dob->mat);
     invert_m4_m4(data->temp_dupli_object.imat, data->temp_dupli_object.obmat);
-    iter->current = &data->temp_dupli_object;
+    data->geometry_component_owner = &data->temp_dupli_object;
+    data->geometry_component_id = 0;
     BLI_assert(deg::deg_validate_copy_on_write_datablock(&data->temp_dupli_object.id));
     return true;
   }
 
+  verify_id_properties_freed(data);
+  free_object_duplilist(data->dupli_list);
+  data->dupli_parent = nullptr;
+  data->dupli_list = nullptr;
+  data->dupli_object_next = nullptr;
+  data->dupli_object_current = nullptr;
+  deg_invalidate_iterator_work_data(data);
   return false;
 }
 
-void deg_iterator_objects_step(BLI_Iterator *iter, deg::IDNode *id_node)
+/* Returns false when iterator is exhausted. */
+bool deg_iterator_objects_step(DEGObjectIterData *data)
 {
-  /* Set it early in case we need to exit and we are running from within a loop. */
-  iter->skip = true;
+  deg::Depsgraph *deg_graph = reinterpret_cast<deg::Depsgraph *>(data->graph);
 
-  if (!id_node->is_directly_visible) {
-    return;
-  }
+  for (; data->id_node_index < data->num_id_nodes; data->id_node_index++) {
+    deg::IDNode *id_node = deg_graph->id_nodes[data->id_node_index];
 
-  DEGObjectIterData *data = (DEGObjectIterData *)iter->data;
-  const ID_Type id_type = GS(id_node->id_orig->name);
+    if (!id_node->is_directly_visible) {
+      continue;
+    }
 
-  if (id_type != ID_OB) {
-    return;
-  }
+    const ID_Type id_type = GS(id_node->id_orig->name);
 
-  switch (id_node->linked_state) {
-    case deg::DEG_ID_LINKED_DIRECTLY:
-      if ((data->flag & DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY) == 0) {
-        return;
-      }
-      break;
-    case deg::DEG_ID_LINKED_VIA_SET:
-      if ((data->flag & DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET) == 0) {
-        return;
-      }
-      break;
-    case deg::DEG_ID_LINKED_INDIRECTLY:
-      if ((data->flag & DEG_ITER_OBJECT_FLAG_LINKED_INDIRECTLY) == 0) {
-        return;
-      }
-      break;
-  }
+    if (id_type != ID_OB) {
+      continue;
+    }
+
+    switch (id_node->linked_state) {
+      case deg::DEG_ID_LINKED_DIRECTLY:
+        if ((data->flag & DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY) == 0) {
+          continue;
+        }
+        break;
+      case deg::DEG_ID_LINKED_VIA_SET:
+        if ((data->flag & DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET) == 0) {
+          continue;
+        }
+        break;
+      case deg::DEG_ID_LINKED_INDIRECTLY:
+        if ((data->flag & DEG_ITER_OBJECT_FLAG_LINKED_INDIRECTLY) == 0) {
+          continue;
+        }
+        break;
+    }
 
-  Object *object = (Object *)id_node->id_cow;
-  BLI_assert(deg::deg_validate_copy_on_write_datablock(&object->id));
+    Object *object = (Object *)id_node->id_cow;
+    BLI_assert(deg::deg_validate_copy_on_write_datablock(&object->id));
 
-  int ob_visibility = OB_VISIBLE_ALL;
-  if (data->flag & DEG_ITER_OBJECT_FLAG_VISIBLE) {
-    ob_visibility = BKE_object_visibility(object, data->eval_mode);
+    int ob_visibility = OB_VISIBLE_ALL;
+    if (data->flag & DEG_ITER_OBJECT_FLAG_VISIBLE) {
+      ob_visibility = BKE_object_visibility(object, data->eval_mode);
 
-    if (object->type != OB_MBALL && deg_object_hide_original(data->eval_mode, object, nullptr)) {
-      return;
+      if (object->type != OB_MBALL && deg_object_hide_original(data->eval_mode, object, nullptr)) {
+        continue;
+      }
     }
-  }
 
-  if (ob_visibility & OB_VISIBLE_INSTANCES) {
-    if ((data->flag & DEG_ITER_OBJECT_FLAG_DUPLI) &&
-        ((object->transflag & OB_DUPLI) || object->runtime.geometry_set_eval != nullptr)) {
-      data->dupli_parent = object;
-      data->dupli_list = object_duplilist(data->graph, data->scene, object);
-      data->dupli_object_next = (DupliObject *)data->dupli_list->first;
+    if (ob_visibility & OB_VISIBLE_INSTANCES) {
+      if ((data->flag & DEG_ITER_OBJECT_FLAG_DUPLI) &&
+          ((object->transflag & OB_DUPLI) || object->runtime.geometry_set_eval != nullptr)) {
+        data->dupli_parent = object;
+        data->dupli_list = object_duplilist(data->graph, data->scene, object);
+        data->dupli_object_next = (DupliObject *)data->dupli_list->first;
+      }
     }
-  }
 
-  if (ob_visibility & (OB_VISIBLE_SELF | OB_VISIBLE_PARTICLES)) {
-    iter->current = object;
-    if (object->runtime.geometry_set_eval) {
-      data->geometry_set_c = object->runtime.geometry_set_eval;
-      data->next_geometry_set_component = (int)bke::GeometryComponentType::Mesh;
-      data->geometry_set_owner = object;
-      iter->skip = true;
-    }
-    else {
-      iter->skip = false;
+    if (ob_visibility & (OB_VISIBLE_SELF | OB_VISIBLE_PARTICLES)) {
+      data->geometry_component_owner = object;
+      data->geometry_component_id = 0;
     }
+    data->id_node_index++;
+    return true;
   }
+  return false;
 }
 
 }  // namespace
@@ -272,78 +335,29 @@ void DEG_iterator_objects_begin(BLI_Iterator *iter, DEGObjectIterData *data)
   data->id_node_index = 0;
   data->num_id_nodes = num_id_nodes;
   data->eval_mode = DEG_get_mode(depsgraph);
-  data->next_geometry_set_component = 0;
-  data->geometry_set_owner = nullptr;
-  data->geometry_set_c = nullptr;
+  data->geometry_component_id = 0;
+  data->geometry_component_owner = nullptr;
   deg_invalidate_iterator_work_data(data);
 
-  deg::IDNode *id_node = deg_graph->id_nodes[data->id_node_index];
-  deg_iterator_objects_step(iter, id_node);
-
-  if (iter->skip) {
-    DEG_iterator_objects_next(iter);
-  }
+  DEG_iterator_objects_next(iter);
 }
 
 void DEG_iterator_objects_next(BLI_Iterator *iter)
 {
   DEGObjectIterData *data = (DEGObjectIterData *)iter->data;
-  Depsgraph *depsgraph = data->graph;
-  deg::Depsgraph *deg_graph = reinterpret_cast<deg::Depsgraph *>(depsgraph);
-  do {
-    iter->skip = false;
-
-    if (data->geometry_set_c != nullptr) {
-      bke::GeometrySet *geometry_set = bke::unwrap(data->geometry_set_c);
-      if (data->next_geometry_set_component == (int)bke::GeometryComponentType::Mesh) {
-        data->next_geometry_set_component = (int)bke::GeometryComponentType::PointCloud;
-        const Mesh *mesh = geometry_set->get_mesh_for_read();
-        if (mesh != nullptr) {
-          Object *temp_object = &data->temp_geometry_component_object;
-          *temp_object = *data->geometry_set_owner;
-          temp_object->type = OB_MESH;
-          temp_object->data = (void *)mesh;
-          iter->current = temp_object;
-          return;
-        }
-      }
-      if (data->next_geometry_set_component == (int)bke::GeometryComponentType::PointCloud) {
-        data->geometry_set_c = nullptr;
-        const PointCloud *pointcloud = geometry_set->get_pointcloud_for_read();
-        if (pointcloud != nullptr) {
-          Object *temp_object = &data->temp_geometry_component_object;
-          *temp_object = *data->geometry_set_owner;
-          temp_object->type = OB_POINTCLOUD;
-        

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list