[Bf-blender-cvs] [d6c17cb276e] temp-modifiers-instancing: update point cloud modiifer interface

Jacques Lucke noreply at git.blender.org
Tue Nov 10 16:39:02 CET 2020


Commit: d6c17cb276ecba597be9d140829acce5ce0c35ca
Author: Jacques Lucke
Date:   Tue Nov 10 11:50:59 2020 +0100
Branches: temp-modifiers-instancing
https://developer.blender.org/rBd6c17cb276ecba597be9d140829acce5ce0c35ca

update point cloud modiifer interface

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

M	source/blender/blenkernel/BKE_geometry_set.hh
M	source/blender/blenkernel/BKE_modifier.h
M	source/blender/blenkernel/intern/geometry_set.cc
M	source/blender/blenkernel/intern/object.c
M	source/blender/blenkernel/intern/pointcloud.cc
M	source/blender/modifiers/intern/MOD_nodes.cc

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

diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh
index 9a19054cb7c..a625158367b 100644
--- a/source/blender/blenkernel/BKE_geometry_set.hh
+++ b/source/blender/blenkernel/BKE_geometry_set.hh
@@ -130,6 +130,8 @@ 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);
 
   /* Utility methods for access. */
   bool has_mesh() const;
@@ -188,4 +190,14 @@ class PointCloudComponent : public GeometryComponent {
   static constexpr inline GeometryComponentType type = GeometryComponentType::PointCloud;
 };
 
+inline GeometrySetC *wrap(blender::bke::GeometrySet *geometry_set)
+{
+  return reinterpret_cast<GeometrySetC *>(geometry_set);
+}
+
+inline blender::bke::GeometrySet *unwrap(GeometrySetC *geometry_set_c)
+{
+  return reinterpret_cast<blender::bke::GeometrySet *>(geometry_set_c);
+}
+
 }  // namespace blender::bke
diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h
index a2c3787bcd2..868f13e3488 100644
--- a/source/blender/blenkernel/BKE_modifier.h
+++ b/source/blender/blenkernel/BKE_modifier.h
@@ -43,6 +43,7 @@ struct ModifierData;
 struct Object;
 struct Scene;
 struct bArmature;
+struct GeometrySetC;
 
 typedef enum {
   /* Should not be used, only for None modifier type */
@@ -246,9 +247,9 @@ typedef struct ModifierTypeInfo {
   struct Hair *(*modifyHair)(struct ModifierData *md,
                              const struct ModifierEvalContext *ctx,
                              struct Hair *hair);
-  struct PointCloud *(*modifyPointCloud)(struct ModifierData *md,
-                                         const struct ModifierEvalContext *ctx,
-                                         struct PointCloud *pointcloud);
+  struct GeometrySetC *(*modifyPointCloud)(struct ModifierData *md,
+                                           const struct ModifierEvalContext *ctx,
+                                           struct GeometrySetC *geometry_set_c);
   struct Volume *(*modifyVolume)(struct ModifierData *md,
                                  const struct ModifierEvalContext *ctx,
                                  struct Volume *volume);
diff --git a/source/blender/blenkernel/intern/geometry_set.cc b/source/blender/blenkernel/intern/geometry_set.cc
index e8d09dfd042..5e303dd53bd 100644
--- a/source/blender/blenkernel/intern/geometry_set.cc
+++ b/source/blender/blenkernel/intern/geometry_set.cc
@@ -162,8 +162,7 @@ bool GeometrySet::has_pointcloud() const
   return component != nullptr && component->has_pointcloud();
 }
 
-/* Create a new geometry set that only contains the given mesh. Ownership of the mesh is
- * transferred to the new geometry. */
+/* Create a new geometry set that only contains the given mesh. */
 GeometrySetPtr GeometrySet::create_with_mesh(Mesh *mesh, bool transfer_ownership)
 {
   GeometrySet *geometry_set = new GeometrySet();
@@ -172,6 +171,15 @@ GeometrySetPtr GeometrySet::create_with_mesh(Mesh *mesh, bool transfer_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)
+{
+  GeometrySet *geometry_set = new GeometrySet();
+  PointCloudComponent &component = geometry_set->get_component_for_write<PointCloudComponent>();
+  component.replace(pointcloud, transfer_ownership);
+  return geometry_set;
+}
+
 /* Clear the existing mesh and replace it with the given one. */
 void GeometrySet::replace_mesh(Mesh *mesh, bool transfer_ownership)
 {
@@ -374,19 +382,14 @@ PointCloud *PointCloudComponent::get_for_write()
 /** \name C API
  * \{ */
 
-static blender::bke::GeometrySet *unwrap(GeometrySetC *geometry_set)
-{
-  return reinterpret_cast<blender::bke::GeometrySet *>(geometry_set);
-}
-
 void BKE_geometry_set_user_add(GeometrySetC *geometry_set)
 {
-  unwrap(geometry_set)->user_add();
+  blender::bke::unwrap(geometry_set)->user_add();
 }
 
 void BKE_geometry_set_user_remove(GeometrySetC *geometry_set)
 {
-  unwrap(geometry_set)->user_remove();
+  blender::bke::unwrap(geometry_set)->user_remove();
 }
 
 /** \} */
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 80535261023..9edf4056145 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -1285,8 +1285,7 @@ bool BKE_object_support_modifier_type_check(const Object *ob, int modifier_type)
     return (mti->modifyHair != NULL) || (mti->flags & eModifierTypeFlag_AcceptsVertexCosOnly);
   }
   if (ob->type == OB_POINTCLOUD) {
-    return (mti->modifyPointCloud != NULL) ||
-           (mti->flags & eModifierTypeFlag_AcceptsVertexCosOnly);
+    return (mti->modifyPointCloud != NULL);
   }
   if (ob->type == OB_VOLUME) {
     return (mti->modifyVolume != NULL);
@@ -1558,6 +1557,7 @@ void BKE_object_free_derived_caches(Object *ob)
 
   if (ob->runtime.geometry_set_eval != NULL) {
     BKE_geometry_set_user_remove(ob->runtime.geometry_set_eval);
+    ob->runtime.geometry_set_eval = NULL;
   }
 }
 
diff --git a/source/blender/blenkernel/intern/pointcloud.cc b/source/blender/blenkernel/intern/pointcloud.cc
index f6a2beb9767..eca1dd98bf7 100644
--- a/source/blender/blenkernel/intern/pointcloud.cc
+++ b/source/blender/blenkernel/intern/pointcloud.cc
@@ -33,6 +33,7 @@
 
 #include "BKE_anim_data.h"
 #include "BKE_customdata.h"
+#include "BKE_geometry_set.hh"
 #include "BKE_global.h"
 #include "BKE_idtype.h"
 #include "BKE_lib_id.h"
@@ -86,6 +87,8 @@ static void pointcloud_copy_data(Main *UNUSED(bmain), ID *id_dst, const ID *id_s
                   alloc_type,
                   pointcloud_dst->totpoint);
   BKE_pointcloud_update_customdata_pointers(pointcloud_dst);
+
+  pointcloud_dst->batch_cache = NULL;
 }
 
 static void pointcloud_free_data(ID *id)
@@ -329,12 +332,13 @@ PointCloud *BKE_pointcloud_copy_for_eval(struct PointCloud *pointcloud_src, bool
   return result;
 }
 
-static PointCloud *pointcloud_evaluate_modifiers(struct Depsgraph *depsgraph,
-                                                 struct Scene *scene,
-                                                 Object *object,
-                                                 PointCloud *pointcloud_input)
+static blender::bke::GeometrySetPtr pointcloud_evaluate_modifiers(
+    struct Depsgraph *depsgraph,
+    struct Scene *scene,
+    Object *object,
+    blender::bke::GeometrySetPtr geometry_set)
 {
-  PointCloud *pointcloud = pointcloud_input;
+  using namespace blender::bke;
 
   /* Modifier evaluation modes. */
   const bool use_render = (DEG_get_mode(depsgraph) == DAG_EVAL_RENDER);
@@ -355,55 +359,34 @@ static PointCloud *pointcloud_evaluate_modifiers(struct Depsgraph *depsgraph,
       continue;
     }
 
-    if ((mti->type == eModifierTypeType_OnlyDeform) &&
-        (mti->flags & eModifierTypeFlag_AcceptsVertexCosOnly)) {
-      /* Ensure we are not modifying the input. */
-      if (pointcloud == pointcloud_input) {
-        pointcloud = BKE_pointcloud_copy_for_eval(pointcloud, true);
-      }
-
-      /* Ensure we are not overwriting referenced data. */
-      CustomData_duplicate_referenced_layer_named(
-          &pointcloud->pdata, CD_PROP_FLOAT3, POINTCLOUD_ATTR_POSITION, pointcloud->totpoint);
-      BKE_pointcloud_update_customdata_pointers(pointcloud);
-
-      /* Created deformed coordinates array on demand. */
-      mti->deformVerts(md, &mectx, nullptr, pointcloud->co, pointcloud->totpoint);
-    }
-    else if (mti->modifyPointCloud) {
-      /* Ensure we are not modifying the input. */
-      if (pointcloud == pointcloud_input) {
-        pointcloud = BKE_pointcloud_copy_for_eval(pointcloud, true);
-      }
-
-      PointCloud *pointcloud_next = mti->modifyPointCloud(md, &mectx, pointcloud);
-
-      if (pointcloud_next && pointcloud_next != pointcloud) {
-        /* If the modifier returned a new pointcloud, release the old one. */
-        if (pointcloud != pointcloud_input) {
-          BKE_id_free(nullptr, pointcloud);
-        }
-        pointcloud = pointcloud_next;
-      }
+    if (mti->modifyPointCloud) {
+      GeometrySetC *modifier_input_geometry_set = wrap(geometry_set.release());
+      GeometrySetC *modifier_output_geometry_set = mti->modifyPointCloud(
+          md, &mectx, modifier_input_geometry_set);
+      geometry_set = unwrap(modifier_output_geometry_set);
     }
   }
 
-  return pointcloud;
+  return geometry_set;
 }
 
 void BKE_pointcloud_data_update(struct Depsgraph *depsgraph, struct Scene *scene, Object *object)
 {
+  using namespace blender::bke;
+
   /* Free any evaluated data and restore original data. */
   BKE_object_free_derived_caches(object);
 
   /* Evaluate modifiers. */
   PointCloud *pointcloud = static_cast<PointCloud *>(object->data);
-  PointCloud *pointcloud_eval = pointcloud_evaluate_modifiers(
-      depsgraph, scene, object, pointcloud);
+  GeometrySetPtr input_geometry_set = GeometrySet::create_with_pointcloud(pointcloud, false);
+  GeometrySetPtr geometry_set_eval = pointcloud_evaluate_modifiers(
+      depsgraph, scene, object, input_geometry_set);
 
   /* Assign evaluated object. */
-  const bool is_owned = (pointcloud != pointcloud_eval);
-  BKE_object_eval_assign_data(object, &pointcloud_eval->id, is_owned);
+  BKE_object_eval_assign_data(object, &pointcloud->id, false);
+  BLI_assert(object->runtime.geometry_set_eval == nullptr);
+  object->runtime.geometry_set_eval = wrap(geometry_set_eval.release());
 }
 
 /* Draw Cache */
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index bc05f32600c..5f9873f7545 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -124,16 +124,6 @@ static bool isDisabled(const struct Scene *UNUSED(scene),
   return false;
 }
 
-static PointCloud *modifyPointCloud(ModifierData *md,
-                                    const Modifi

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list