Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/blenkernel/intern/pointcloud.cc')
-rw-r--r--source/blender/blenkernel/intern/pointcloud.cc36
1 files changed, 31 insertions, 5 deletions
diff --git a/source/blender/blenkernel/intern/pointcloud.cc b/source/blender/blenkernel/intern/pointcloud.cc
index 5f6685817b9..7bd14e80333 100644
--- a/source/blender/blenkernel/intern/pointcloud.cc
+++ b/source/blender/blenkernel/intern/pointcloud.cc
@@ -365,12 +365,31 @@ static void pointcloud_evaluate_modifiers(struct Depsgraph *depsgraph,
continue;
}
- if (mti->modifyPointCloud) {
- mti->modifyPointCloud(md, &mectx, &geometry_set);
+ if (mti->modifyGeometrySet) {
+ mti->modifyGeometrySet(md, &mectx, &geometry_set);
}
}
}
+static PointCloud *take_pointcloud_ownership_from_geometry_set(GeometrySet &geometry_set)
+{
+ if (!geometry_set.has<PointCloudComponent>()) {
+ return nullptr;
+ }
+ PointCloudComponent &pointcloud_component =
+ geometry_set.get_component_for_write<PointCloudComponent>();
+ PointCloud *pointcloud = pointcloud_component.release();
+ if (pointcloud != nullptr) {
+ /* Add back, but as read-only non-owning component. */
+ pointcloud_component.replace(pointcloud, GeometryOwnershipType::ReadOnly);
+ }
+ else {
+ /* The component was empty, we can also remove it. */
+ geometry_set.remove<PointCloudComponent>();
+ }
+ return pointcloud;
+}
+
void BKE_pointcloud_data_update(struct Depsgraph *depsgraph, struct Scene *scene, Object *object)
{
/* Free any evaluated data and restore original data. */
@@ -382,10 +401,17 @@ void BKE_pointcloud_data_update(struct Depsgraph *depsgraph, struct Scene *scene
GeometryOwnershipType::ReadOnly);
pointcloud_evaluate_modifiers(depsgraph, scene, object, geometry_set);
+ PointCloud *pointcloud_eval = take_pointcloud_ownership_from_geometry_set(geometry_set);
+
+ /* If the geometry set did not contain a point cloud, we still create an empty one. */
+ if (pointcloud_eval == nullptr) {
+ pointcloud_eval = BKE_pointcloud_new_nomain(0);
+ }
+
/* Assign evaluated object. */
- PointCloud *dummy_pointcloud = BKE_pointcloud_new_nomain(0);
- BKE_object_eval_assign_data(object, &dummy_pointcloud->id, true);
- object->runtime.geometry_set_eval = new GeometrySet(geometry_set);
+ const bool eval_is_owned = pointcloud_eval != pointcloud;
+ BKE_object_eval_assign_data(object, &pointcloud_eval->id, eval_is_owned);
+ object->runtime.geometry_set_eval = new GeometrySet(std::move(geometry_set));
}
/* Draw Cache */