[Bf-blender-cvs] [51b4162fed5] spreadsheet-active-node: direct data ownership

Jacques Lucke noreply at git.blender.org
Thu Apr 1 15:03:46 CEST 2021


Commit: 51b4162fed5ca56c9780f9663722ab8a7124506b
Author: Jacques Lucke
Date:   Thu Apr 1 14:30:51 2021 +0200
Branches: spreadsheet-active-node
https://developer.blender.org/rB51b4162fed5ca56c9780f9663722ab8a7124506b

direct data ownership

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

M	source/blender/blenkernel/BKE_geometry_set.hh
M	source/blender/blenkernel/intern/geometry_component_instances.cc
M	source/blender/blenkernel/intern/geometry_component_mesh.cc
M	source/blender/blenkernel/intern/geometry_component_pointcloud.cc
M	source/blender/blenkernel/intern/geometry_component_volume.cc
M	source/blender/blenkernel/intern/geometry_set.cc

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

diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh
index 54f4465b71c..c096987a458 100644
--- a/source/blender/blenkernel/BKE_geometry_set.hh
+++ b/source/blender/blenkernel/BKE_geometry_set.hh
@@ -141,9 +141,11 @@ class GeometryComponent {
   /* The returned component should be of the same type as the type this is called on. */
   virtual GeometryComponent *copy() const = 0;
 
-  /* TODO: Make pure virtual. */
-  virtual bool owns_non_instance_data() const;
-  virtual void ensure_own_non_instances();
+  /* Direct data is everything except for instances of objects/collections.
+   * If this returns true, the geometry set can be cached and is still valid after e.g. modifier
+   * evaluation ends. Instances can only be valid as long as the data they instance is valid. */
+  virtual bool owns_direct_data() const = 0;
+  virtual void ensure_owns_direct_data() = 0;
 
   void user_add() const;
   void user_remove() const;
@@ -319,7 +321,7 @@ struct GeometrySet {
 
   void clear();
 
-  void ensure_own_non_instances();
+  void ensure_owns_direct_data();
 
   /* Utility methods for creation. */
   static GeometrySet create_with_mesh(
@@ -380,8 +382,8 @@ class MeshComponent : public GeometryComponent {
 
   bool is_empty() const final;
 
-  bool owns_non_instance_data() const override;
-  void ensure_own_non_instances() override;
+  virtual bool owns_direct_data() const override;
+  virtual void ensure_owns_direct_data() override;
 
   static constexpr inline GeometryComponentType static_type = GEO_COMPONENT_TYPE_MESH;
 
@@ -413,7 +415,8 @@ class PointCloudComponent : public GeometryComponent {
 
   bool is_empty() const final;
 
-  void ensure_own_non_instances() override;
+  virtual bool owns_direct_data() const override;
+  virtual void ensure_owns_direct_data() override;
 
   static constexpr inline GeometryComponentType static_type = GEO_COMPONENT_TYPE_POINT_CLOUD;
 
@@ -455,6 +458,9 @@ class InstancesComponent : public GeometryComponent {
 
   bool is_empty() const final;
 
+  virtual bool owns_direct_data() const override;
+  virtual void ensure_owns_direct_data() override;
+
   static constexpr inline GeometryComponentType static_type = GEO_COMPONENT_TYPE_INSTANCES;
 };
 
@@ -477,5 +483,8 @@ class VolumeComponent : public GeometryComponent {
   const Volume *get_for_read() const;
   Volume *get_for_write();
 
+  virtual bool owns_direct_data() const override;
+  virtual void ensure_owns_direct_data() override;
+
   static constexpr inline GeometryComponentType static_type = GEO_COMPONENT_TYPE_VOLUME;
 };
diff --git a/source/blender/blenkernel/intern/geometry_component_instances.cc b/source/blender/blenkernel/intern/geometry_component_instances.cc
index 68c551645d2..a3b4d7efa00 100644
--- a/source/blender/blenkernel/intern/geometry_component_instances.cc
+++ b/source/blender/blenkernel/intern/geometry_component_instances.cc
@@ -108,6 +108,16 @@ bool InstancesComponent::is_empty() const
   return transforms_.size() == 0;
 }
 
+bool InstancesComponent::owns_direct_data() const
+{
+  return true;
+}
+
+void InstancesComponent::ensure_owns_direct_data()
+{
+  BLI_assert(this->is_mutable());
+}
+
 static blender::Array<int> generate_unique_instance_ids(Span<int> original_ids)
 {
   using namespace blender;
diff --git a/source/blender/blenkernel/intern/geometry_component_mesh.cc b/source/blender/blenkernel/intern/geometry_component_mesh.cc
index 4c221d4c992..df451b5db1d 100644
--- a/source/blender/blenkernel/intern/geometry_component_mesh.cc
+++ b/source/blender/blenkernel/intern/geometry_component_mesh.cc
@@ -157,12 +157,12 @@ bool MeshComponent::is_empty() const
   return mesh_ == nullptr;
 }
 
-bool MeshComponent::owns_non_instance_data() const
+bool MeshComponent::owns_direct_data() const
 {
   return ownership_ == GeometryOwnershipType::Owned;
 }
 
-void MeshComponent::ensure_own_non_instances()
+void MeshComponent::ensure_owns_direct_data()
 {
   BLI_assert(this->is_mutable());
   if (ownership_ != GeometryOwnershipType::Owned) {
diff --git a/source/blender/blenkernel/intern/geometry_component_pointcloud.cc b/source/blender/blenkernel/intern/geometry_component_pointcloud.cc
index a175ce55c4b..135de14b4f7 100644
--- a/source/blender/blenkernel/intern/geometry_component_pointcloud.cc
+++ b/source/blender/blenkernel/intern/geometry_component_pointcloud.cc
@@ -107,7 +107,12 @@ bool PointCloudComponent::is_empty() const
   return pointcloud_ == nullptr;
 }
 
-void PointCloudComponent::ensure_own_non_instances()
+bool PointCloudComponent::owns_direct_data() const
+{
+  return ownership_ == GeometryOwnershipType::Owned;
+}
+
+void PointCloudComponent::ensure_owns_direct_data()
 {
   BLI_assert(this->is_mutable());
   if (ownership_ != GeometryOwnershipType::Owned) {
diff --git a/source/blender/blenkernel/intern/geometry_component_volume.cc b/source/blender/blenkernel/intern/geometry_component_volume.cc
index fd2327e0bf5..94ed07a63de 100644
--- a/source/blender/blenkernel/intern/geometry_component_volume.cc
+++ b/source/blender/blenkernel/intern/geometry_component_volume.cc
@@ -97,4 +97,18 @@ Volume *VolumeComponent::get_for_write()
   return volume_;
 }
 
+bool VolumeComponent::owns_direct_data() const
+{
+  return ownership_ == GeometryOwnershipType::Owned;
+}
+
+void VolumeComponent::ensure_owns_direct_data()
+{
+  BLI_assert(this->is_mutable());
+  if (ownership_ != GeometryOwnershipType::Owned) {
+    volume_ = BKE_volume_copy_for_eval(volume_, false);
+    ownership_ = GeometryOwnershipType::Owned;
+  }
+}
+
 /** \} */
diff --git a/source/blender/blenkernel/intern/geometry_set.cc b/source/blender/blenkernel/intern/geometry_set.cc
index 63d48c31417..1079dcdc616 100644
--- a/source/blender/blenkernel/intern/geometry_set.cc
+++ b/source/blender/blenkernel/intern/geometry_set.cc
@@ -89,15 +89,6 @@ bool GeometryComponent::is_mutable() const
   return users_ <= 1;
 }
 
-bool GeometryComponent::owns_non_instance_data() const
-{
-  return false;
-}
-
-void GeometryComponent::ensure_own_non_instances()
-{
-}
-
 GeometryComponentType GeometryComponent::type() const
 {
   return type_;
@@ -220,13 +211,15 @@ void GeometrySet::clear()
   components_.clear();
 }
 
-void GeometrySet::ensure_own_non_instances()
+/* Make sure that the geometry can be cached. This does not ensure ownership of object/collection
+ * instances. */
+void GeometrySet::ensure_owns_direct_data()
 {
   for (GeometryComponentType type : components_.keys()) {
     const GeometryComponent *component = this->get_component_for_read(type);
-    if (!component->owns_non_instance_data()) {
+    if (!component->owns_direct_data()) {
       GeometryComponent &component_for_write = this->get_component_for_write(type);
-      component_for_write.ensure_own_non_instances();
+      component_for_write.ensure_owns_direct_data();
     }
   }
 }



More information about the Bf-blender-cvs mailing list