[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