[Bf-blender-cvs] [35e203450c2] temp-modifiers-instancing: improve ownership handling in geometry components

Jacques Lucke noreply at git.blender.org
Tue Nov 10 18:09:46 CET 2020


Commit: 35e203450c2b855f50191ab84736943310ad05e6
Author: Jacques Lucke
Date:   Tue Nov 10 18:01:51 2020 +0100
Branches: temp-modifiers-instancing
https://developer.blender.org/rB35e203450c2b855f50191ab84736943310ad05e6

improve ownership handling in geometry components

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

M	source/blender/blenkernel/BKE_geometry_set.hh
M	source/blender/blenkernel/intern/geometry_set.cc
M	source/blender/blenkernel/intern/pointcloud.cc
M	source/blender/modifiers/intern/MOD_nodes.cc
M	source/blender/nodes/NOD_geometry_exec.hh

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

diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh
index e7979260f2a..f5c8fd40c3b 100644
--- a/source/blender/blenkernel/BKE_geometry_set.hh
+++ b/source/blender/blenkernel/BKE_geometry_set.hh
@@ -48,6 +48,15 @@ enum class GeometryComponentType {
   Instances,
 };
 
+enum class GeometryOwnershipType {
+  /* The geometry is owned. This implies that it can be changed. */
+  Owned,
+  /* The geometry can be changed, but someone else is responsible for freeing it. */
+  Editable,
+  /* The geometry cannot be changed and someone else is responsible for freeing it. */
+  ReadOnly,
+};
+
 }  // namespace blender::bke
 
 /* Make it possible to use the component type as key in hash tables. */
@@ -132,9 +141,10 @@ class GeometrySet {
   }
 
   /* Utility methods for creation. */
-  static GeometrySetPtr create_with_mesh(Mesh *mesh, bool transfer_ownership = true);
-  static GeometrySetPtr create_with_pointcloud(PointCloud *pointcloud,
-                                               bool transfer_ownership = true);
+  static GeometrySetPtr create_with_mesh(
+      Mesh *mesh, GeometryOwnershipType ownership = GeometryOwnershipType::Owned);
+  static GeometrySetPtr create_with_pointcloud(
+      PointCloud *pointcloud, GeometryOwnershipType ownership = GeometryOwnershipType::Owned);
 
   /* Utility methods for access. */
   bool has_mesh() const;
@@ -145,8 +155,9 @@ class GeometrySet {
   PointCloud *get_pointcloud_for_write();
 
   /* Utility methods for replacement. */
-  void replace_mesh(Mesh *mesh, bool transfer_ownership = true);
-  void replace_pointcloud(PointCloud *pointcloud, bool transfer_ownership = true);
+  void replace_mesh(Mesh *mesh, GeometryOwnershipType ownership = GeometryOwnershipType::Owned);
+  void replace_pointcloud(PointCloud *pointcloud,
+                          GeometryOwnershipType ownership = GeometryOwnershipType::Owned);
 };
 
 void make_geometry_set_mutable(GeometrySetPtr &geometry);
@@ -155,7 +166,7 @@ void make_geometry_set_mutable(GeometrySetPtr &geometry);
 class MeshComponent : public GeometryComponent {
  private:
   Mesh *mesh_ = nullptr;
-  bool owned_ = false;
+  GeometryOwnershipType ownership_ = GeometryOwnershipType::Owned;
 
  public:
   ~MeshComponent();
@@ -163,7 +174,7 @@ class MeshComponent : public GeometryComponent {
 
   void clear();
   bool has_mesh() const;
-  void replace(Mesh *mesh, bool transfer_ownership = true);
+  void replace(Mesh *mesh, GeometryOwnershipType ownership = GeometryOwnershipType::Owned);
   Mesh *release();
 
   const Mesh *get_for_read() const;
@@ -176,7 +187,7 @@ class MeshComponent : public GeometryComponent {
 class PointCloudComponent : public GeometryComponent {
  private:
   PointCloud *pointcloud_ = nullptr;
-  bool owned_ = false;
+  GeometryOwnershipType ownership_ = GeometryOwnershipType::Owned;
 
  public:
   ~PointCloudComponent();
@@ -184,7 +195,8 @@ class PointCloudComponent : public GeometryComponent {
 
   void clear();
   bool has_pointcloud() const;
-  void replace(PointCloud *pointcloud, bool transfer_ownership = true);
+  void replace(PointCloud *pointcloud,
+               GeometryOwnershipType ownership = GeometryOwnershipType::Owned);
   PointCloud *release();
 
   const PointCloud *get_for_read() const;
diff --git a/source/blender/blenkernel/intern/geometry_set.cc b/source/blender/blenkernel/intern/geometry_set.cc
index 9fda0ab04f6..48bbdff201a 100644
--- a/source/blender/blenkernel/intern/geometry_set.cc
+++ b/source/blender/blenkernel/intern/geometry_set.cc
@@ -165,35 +165,36 @@ bool GeometrySet::has_pointcloud() const
 }
 
 /* Create a new geometry set that only contains the given mesh. */
-GeometrySetPtr GeometrySet::create_with_mesh(Mesh *mesh, bool transfer_ownership)
+GeometrySetPtr GeometrySet::create_with_mesh(Mesh *mesh, GeometryOwnershipType ownership)
 {
   GeometrySet *geometry_set = new GeometrySet();
   MeshComponent &component = geometry_set->get_component_for_write<MeshComponent>();
-  component.replace(mesh, transfer_ownership);
+  component.replace(mesh, ownership);
   return geometry_set;
 }
 
 /* Create a new geometry set that only contains the given point cloud. */
-GeometrySetPtr GeometrySet::create_with_pointcloud(PointCloud *pointcloud, bool transfer_ownership)
+GeometrySetPtr GeometrySet::create_with_pointcloud(PointCloud *pointcloud,
+                                                   GeometryOwnershipType ownership)
 {
   GeometrySet *geometry_set = new GeometrySet();
   PointCloudComponent &component = geometry_set->get_component_for_write<PointCloudComponent>();
-  component.replace(pointcloud, transfer_ownership);
+  component.replace(pointcloud, ownership);
   return geometry_set;
 }
 
 /* Clear the existing mesh and replace it with the given one. */
-void GeometrySet::replace_mesh(Mesh *mesh, bool transfer_ownership)
+void GeometrySet::replace_mesh(Mesh *mesh, GeometryOwnershipType ownership)
 {
   MeshComponent &component = this->get_component_for_write<MeshComponent>();
-  component.replace(mesh, transfer_ownership);
+  component.replace(mesh, ownership);
 }
 
 /* Clear the existing point cloud and replace with the given one. */
-void GeometrySet::replace_pointcloud(PointCloud *pointcloud, bool transfer_ownership)
+void GeometrySet::replace_pointcloud(PointCloud *pointcloud, GeometryOwnershipType ownership)
 {
   PointCloudComponent &pointcloud_component = this->get_component_for_write<PointCloudComponent>();
-  pointcloud_component.replace(pointcloud, transfer_ownership);
+  pointcloud_component.replace(pointcloud, ownership);
 }
 
 /* Returns a mutable mesh or null. No ownership is transferred. */
@@ -248,7 +249,7 @@ GeometryComponent *MeshComponent::copy() const
   MeshComponent *new_component = new MeshComponent();
   if (mesh_ != nullptr) {
     new_component->mesh_ = BKE_mesh_copy_for_eval(mesh_, false);
-    new_component->owned_ = true;
+    new_component->ownership_ = GeometryOwnershipType::Owned;
   }
   return new_component;
 }
@@ -257,7 +258,7 @@ void MeshComponent::clear()
 {
   BLI_assert(this->is_mutable());
   if (mesh_ != nullptr) {
-    if (owned_) {
+    if (ownership_ == GeometryOwnershipType::Owned) {
       BKE_id_free(nullptr, mesh_);
     }
     mesh_ = nullptr;
@@ -270,12 +271,12 @@ bool MeshComponent::has_mesh() const
 }
 
 /* Clear the component and replace it with the new mesh. */
-void MeshComponent::replace(Mesh *mesh, bool transfer_ownership)
+void MeshComponent::replace(Mesh *mesh, GeometryOwnershipType ownership)
 {
   BLI_assert(this->is_mutable());
   this->clear();
   mesh_ = mesh;
-  owned_ = transfer_ownership;
+  ownership_ = ownership;
 }
 
 /* Return the mesh and clear the component. The caller takes over responsibility for freeing the
@@ -300,6 +301,10 @@ const Mesh *MeshComponent::get_for_read() const
 Mesh *MeshComponent::get_for_write()
 {
   BLI_assert(this->is_mutable());
+  if (ownership_ == GeometryOwnershipType::ReadOnly) {
+    mesh_ = BKE_mesh_copy_for_eval(mesh_, false);
+    ownership_ = GeometryOwnershipType::Owned;
+  }
   return mesh_;
 }
 
@@ -319,7 +324,7 @@ GeometryComponent *PointCloudComponent::copy() const
   PointCloudComponent *new_component = new PointCloudComponent();
   if (pointcloud_ != nullptr) {
     new_component->pointcloud_ = BKE_pointcloud_copy_for_eval(pointcloud_, false);
-    new_component->owned_ = true;
+    new_component->ownership_ = GeometryOwnershipType::Owned;
   }
   return new_component;
 }
@@ -328,7 +333,7 @@ void PointCloudComponent::clear()
 {
   BLI_assert(this->is_mutable());
   if (pointcloud_ != nullptr) {
-    if (owned_) {
+    if (ownership_ == GeometryOwnershipType::Owned) {
       BKE_id_free(nullptr, pointcloud_);
     }
     pointcloud_ = nullptr;
@@ -341,12 +346,12 @@ bool PointCloudComponent::has_pointcloud() const
 }
 
 /* Clear the component and replace it with the new point cloud. */
-void PointCloudComponent::replace(PointCloud *pointcloud, bool transfer_ownership)
+void PointCloudComponent::replace(PointCloud *pointcloud, GeometryOwnershipType ownership)
 {
   BLI_assert(this->is_mutable());
   this->clear();
   pointcloud_ = pointcloud;
-  owned_ = transfer_ownership;
+  ownership_ = ownership;
 }
 
 /* Return the point cloud and clear the component. The caller takes over responsibility for freeing
@@ -373,6 +378,10 @@ const PointCloud *PointCloudComponent::get_for_read() const
 PointCloud *PointCloudComponent::get_for_write()
 {
   BLI_assert(this->is_mutable());
+  if (ownership_ == GeometryOwnershipType::ReadOnly) {
+    pointcloud_ = BKE_pointcloud_copy_for_eval(pointcloud_, false);
+    ownership_ = GeometryOwnershipType::Owned;
+  }
   return pointcloud_;
 }
 
diff --git a/source/blender/blenkernel/intern/pointcloud.cc b/source/blender/blenkernel/intern/pointcloud.cc
index 7cc23b35c1c..1dd092711f7 100644
--- a/source/blender/blenkernel/intern/pointcloud.cc
+++ b/source/blender/blenkernel/intern/pointcloud.cc
@@ -379,9 +379,10 @@ void BKE_pointcloud_data_update(struct Depsgraph *depsgraph, struct Scene *scene
 
   /* Evaluate modifiers. */
   PointCloud *pointcloud = static_cast<PointCloud *>(object->data);
-  GeometrySetPtr input_geometry_set = GeometrySet::create_with_pointcloud(pointcloud, false);
+  GeometrySetPtr input_geometry_set = GeometrySet::create_with_pointcloud(
+      pointcloud, GeometryOwnershipType::ReadOnly);
   GeometrySetPtr geometry_set_eval = pointcloud_evaluate_modifiers(
-      depsgraph, scene, object, input_geometry_set);
+      depsgraph, scene, object, std::move(input_geometry_set));
 
   /* Assign evaluated object. */
   /* Just use the original point cloud for now. */
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index 5c62e29bf05..f5f67ee222f 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -844,7 +844,8 @@ static GeometrySetPtr modifyGeometry(ModifierData *md,
 
 static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
 {
-  GeometrySetPtr input_geometry_set = GeometrySet::create_with_mesh(mesh, false);
+  GeometrySetPtr input_geometry_set = GeometrySet::create_with_mesh(


@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list