[Bf-blender-cvs] [b3e6a2888a2] master: Point Cloud: Support applying modifiers

Hans Goudey noreply at git.blender.org
Thu Oct 13 02:16:51 CEST 2022


Commit: b3e6a2888a2d6c7040479fa34cb933870773df36
Author: Hans Goudey
Date:   Wed Oct 12 19:16:22 2022 -0500
Branches: master
https://developer.blender.org/rBb3e6a2888a2d6c7040479fa34cb933870773df36

Point Cloud: Support applying modifiers

The geometry nodes modifier can now be applied on point cloud objects.
This is basically a copy of the logic from 96bdd65e740e669ece
and 538da79c6d17a6e660a9.

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

M	source/blender/editors/object/object_modifier.cc

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

diff --git a/source/blender/editors/object/object_modifier.cc b/source/blender/editors/object/object_modifier.cc
index 872d2367332..9310aa3c58c 100644
--- a/source/blender/editors/object/object_modifier.cc
+++ b/source/blender/editors/object/object_modifier.cc
@@ -21,6 +21,7 @@
 #include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"
 #include "DNA_object_force_types.h"
+#include "DNA_pointcloud_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_space_types.h"
 
@@ -855,8 +856,38 @@ static bool modifier_apply_obdata(
     Main *bmain = DEG_get_bmain(depsgraph);
     BKE_object_material_from_eval_data(bmain, ob, &curves_eval.id);
   }
+  else if (ob->type == OB_POINTCLOUD) {
+    PointCloud &points = *static_cast<PointCloud *>(ob->data);
+    if (mti->modifyGeometrySet == nullptr) {
+      BLI_assert_unreachable();
+      return false;
+    }
+
+    /* Create a temporary geometry set and component. */
+    GeometrySet geometry_set;
+    geometry_set.get_component_for_write<PointCloudComponent>().replace(
+        &points, GeometryOwnershipType::ReadOnly);
+
+    ModifierEvalContext mectx = {depsgraph, ob, (ModifierApplyFlag)0};
+    mti->modifyGeometrySet(md_eval, &mectx, &geometry_set);
+    if (!geometry_set.has_pointcloud()) {
+      BKE_report(
+          reports, RPT_ERROR, "Evaluated geometry from modifier does not contain a point cloud");
+      return false;
+    }
+    PointCloud *pointcloud_eval =
+        geometry_set.get_component_for_write<PointCloudComponent>().release();
+
+    /* Anonymous attributes shouldn't be available on the applied geometry. */
+    pointcloud_eval->attributes_for_write().remove_anonymous();
+
+    /* Copy the relevant information to the original. */
+    Main *bmain = DEG_get_bmain(depsgraph);
+    BKE_object_material_from_eval_data(bmain, ob, &pointcloud_eval->id);
+    BKE_pointcloud_nomain_to_pointcloud(pointcloud_eval, &points, true);
+  }
   else {
-    /* TODO: implement for point clouds and volumes. */
+    /* TODO: implement for volumes. */
     BKE_report(reports, RPT_ERROR, "Cannot apply modifier for this object type");
     return false;
   }



More information about the Bf-blender-cvs mailing list