[Bf-blender-cvs] [56548260e28] temp-modifiers-instancing: initial drawing of mesh in point cloud

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


Commit: 56548260e288e3416a33a4adbcd78bb8c1c2a32b
Author: Jacques Lucke
Date:   Wed Nov 11 14:10:10 2020 +0100
Branches: temp-modifiers-instancing
https://developer.blender.org/rB56548260e288e3416a33a4adbcd78bb8c1c2a32b

initial drawing of mesh in point cloud

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

M	source/blender/blenkernel/BKE_geometry_set.hh
M	source/blender/depsgraph/DEG_depsgraph_query.h
M	source/blender/depsgraph/intern/depsgraph_query_iter.cc

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

diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh
index 72d60dc917d..0d531deee0a 100644
--- a/source/blender/blenkernel/BKE_geometry_set.hh
+++ b/source/blender/blenkernel/BKE_geometry_set.hh
@@ -43,18 +43,18 @@ using GeometrySetPtr = UserCounter<class GeometrySet>;
  * stores. Functions modifying a geometry will usually just modify a subset of the component types.
  */
 enum class GeometryComponentType {
-  Mesh,
-  PointCloud,
-  Instances,
+  Mesh = 0,
+  PointCloud = 1,
+  Instances = 2,
 };
 
 enum class GeometryOwnershipType {
   /* The geometry is owned. This implies that it can be changed. */
-  Owned,
+  Owned = 0,
   /* The geometry can be changed, but someone else is responsible for freeing it. */
-  Editable,
+  Editable = 1,
   /* The geometry cannot be changed and someone else is responsible for freeing it. */
-  ReadOnly,
+  ReadOnly = 2,
 };
 
 }  // namespace blender::bke
diff --git a/source/blender/depsgraph/DEG_depsgraph_query.h b/source/blender/depsgraph/DEG_depsgraph_query.h
index 7eb5f1ccec1..1d942c4e2a8 100644
--- a/source/blender/depsgraph/DEG_depsgraph_query.h
+++ b/source/blender/depsgraph/DEG_depsgraph_query.h
@@ -42,6 +42,7 @@ struct ListBase;
 struct PointerRNA;
 struct Scene;
 struct ViewLayer;
+struct GeometrySetC;
 
 #ifdef __cplusplus
 extern "C" {
@@ -145,6 +146,11 @@ 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;
+
   /* **** Iteration over dupli-list. *** */
 
   /* Object which created the dupli-list. */
diff --git a/source/blender/depsgraph/intern/depsgraph_query_iter.cc b/source/blender/depsgraph/intern/depsgraph_query_iter.cc
index 40ac8323283..36d2c5414fb 100644
--- a/source/blender/depsgraph/intern/depsgraph_query_iter.cc
+++ b/source/blender/depsgraph/intern/depsgraph_query_iter.cc
@@ -237,7 +237,15 @@ void deg_iterator_objects_step(BLI_Iterator *iter, deg::IDNode *id_node)
 
   if (ob_visibility & (OB_VISIBLE_SELF | OB_VISIBLE_PARTICLES)) {
     iter->current = object;
-    iter->skip = false;
+    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;
+    }
   }
 }
 
@@ -264,6 +272,9 @@ 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;
   deg_invalidate_iterator_work_data(data);
 
   deg::IDNode *id_node = deg_graph->id_nodes[data->id_node_index];
@@ -281,6 +292,35 @@ void DEG_iterator_objects_next(BLI_Iterator *iter)
   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_dupli_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_dupli_object;
+          *temp_object = *data->geometry_set_owner;
+          temp_object->type = OB_POINTCLOUD;
+          temp_object->data = (void *)pointcloud;
+          iter->current = temp_object;
+          return;
+        }
+      }
+    }
+
     if (data->dupli_list) {
       if (deg_objects_dupli_iterator_next(iter)) {
         return;



More information about the Bf-blender-cvs mailing list