[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