[Bf-blender-cvs] [d6f02083a41] new-object-types: Objects: use evaluated data runtime storage for hair, point clouds and volumes

Brecht Van Lommel noreply at git.blender.org
Sun Jan 26 19:45:04 CET 2020


Commit: d6f02083a418d17387f5a56222664b5d60e50743
Author: Brecht Van Lommel
Date:   Sun Jan 26 16:50:57 2020 +0100
Branches: new-object-types
https://developer.blender.org/rBd6f02083a418d17387f5a56222664b5d60e50743

Objects: use evaluated data runtime storage for hair, point clouds and volumes

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

M	source/blender/blenkernel/intern/effect.c
M	source/blender/blenkernel/intern/hair.c
M	source/blender/blenkernel/intern/object.c
M	source/blender/blenkernel/intern/pointcloud.c
M	source/blender/blenkernel/intern/volume.cc
M	source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_object.cc

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

diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c
index 4a9efc7cac4..9ef6ab131df 100644
--- a/source/blender/blenkernel/intern/effect.c
+++ b/source/blender/blenkernel/intern/effect.c
@@ -656,6 +656,7 @@ int get_effector_data(EffectorCache *eff,
     efd->size = 0.0f;
   }
   else if (eff->pd && eff->pd->shape == PFIELD_SHAPE_POINTS) {
+    /* TODO: hair and points object support */
     Mesh *me_eval = BKE_object_get_evaluated_mesh(eff->ob);
     if (me_eval != NULL) {
       copy_v3_v3(efd->loc, me_eval->mvert[*efd->index].co);
@@ -769,6 +770,7 @@ static void get_effector_tot(
   efd->index = p;
 
   if (eff->pd->shape == PFIELD_SHAPE_POINTS) {
+    /* TODO: hair and points object support */
     Mesh *me_eval = BKE_object_get_evaluated_mesh(eff->ob);
     *tot = me_eval != NULL ? me_eval->totvert : 1;
 
diff --git a/source/blender/blenkernel/intern/hair.c b/source/blender/blenkernel/intern/hair.c
index 5cf2d48dd8a..8aaacbc75aa 100644
--- a/source/blender/blenkernel/intern/hair.c
+++ b/source/blender/blenkernel/intern/hair.c
@@ -222,9 +222,19 @@ Hair *BKE_hair_copy_for_eval(Hair *hair_src, bool reference)
 
 void BKE_hair_data_update(struct Depsgraph *UNUSED(depsgraph),
                           struct Scene *UNUSED(scene),
-                          Object *UNUSED(object))
+                          Object *object)
 {
-  /* Nothing to do yet. */
+  /* Free any evaluated data and restore original data. */
+  BKE_object_free_derived_caches(object);
+
+  /* Modifier evaluation goes here, using BKE_hair_new_for_eval or
+   * BKE_hair_copy_for_eval to create a new Hair. */
+  Hair *hair = object->data;
+  Hair *hair_eval = hair;
+
+  /* Assign evaluated object. */
+  const bool is_owned = (hair != hair_eval);
+  BKE_object_eval_assign_data(object, &hair_eval->id, is_owned);
 }
 
 /* Draw Cache */
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index ae7dbac4c23..9f6802b66ea 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -3196,6 +3196,7 @@ void BKE_object_foreach_display_point(Object *ob,
                                       void (*func_cb)(const float[3], void *),
                                       void *user_data)
 {
+  /* TODO: pointcloud and hair objects support */
   Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob);
   float co[3];
 
diff --git a/source/blender/blenkernel/intern/pointcloud.c b/source/blender/blenkernel/intern/pointcloud.c
index e06682b2823..3ac8ff85ddc 100644
--- a/source/blender/blenkernel/intern/pointcloud.c
+++ b/source/blender/blenkernel/intern/pointcloud.c
@@ -188,9 +188,19 @@ PointCloud *BKE_pointcloud_copy_for_eval(struct PointCloud *pointcloud_src, bool
 
 void BKE_pointcloud_data_update(struct Depsgraph *UNUSED(depsgraph),
                                 struct Scene *UNUSED(scene),
-                                Object *UNUSED(object))
+                                Object *object)
 {
-  /* Nothing to do yet. */
+  /* Free any evaluated data and restore original data. */
+  BKE_object_free_derived_caches(object);
+
+  /* Modifier evaluation goes here, using BKE_pointcloud_new_for_eval or
+   * BKE_pointcloud_copy_for_eval to create a new PointCloud. */
+  PointCloud *pointcloud = object->data;
+  PointCloud *pointcloud_eval = pointcloud;
+
+  /* Assign evaluated object. */
+  const bool is_owned = (pointcloud != pointcloud_eval);
+  BKE_object_eval_assign_data(object, &pointcloud_eval->id, is_owned);
 }
 
 /* Draw Cache */
diff --git a/source/blender/blenkernel/intern/volume.cc b/source/blender/blenkernel/intern/volume.cc
index 73113c70f9a..3f2a2918d93 100644
--- a/source/blender/blenkernel/intern/volume.cc
+++ b/source/blender/blenkernel/intern/volume.cc
@@ -252,9 +252,19 @@ Volume *BKE_volume_copy_for_eval(Volume *volume_src, bool reference)
 
 void BKE_volume_data_update(struct Depsgraph *UNUSED(depsgraph),
                             struct Scene *UNUSED(scene),
-                            Object *UNUSED(object))
+                            Object *object)
 {
-  /* Nothing to do yet. */
+  /* Free any evaluated data and restore original data. */
+  BKE_object_free_derived_caches(object);
+
+  /* Modifier evaluation goes here, using BKE_volume_new_for_eval or
+   * BKE_volume_copy_for_eval to create a new Volume. */
+  Volume *volume = (Volume *)object->data;
+  Volume *volume_eval = volume;
+
+  /* Assign evaluated object. */
+  const bool is_owned = (volume != volume_eval);
+  BKE_object_eval_assign_data(object, &volume_eval->id, is_owned);
 }
 
 /* Draw Cache */
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_object.cc b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_object.cc
index 653761015dd..e5440ecc21b 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_object.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_object.cc
@@ -132,9 +132,14 @@ void ObjectRuntimeBackup::restore_to_object(Object *object)
   else if (ELEM(object->type, OB_HAIR, OB_POINTCLOUD, OB_VOLUME)) {
     if (object->id.recalc & ID_RECALC_GEOMETRY) {
       /* Free evaluated caches. */
+      object->data = data_orig;
       BKE_object_free_derived_caches(object);
     }
+    else {
+      object->data = object->runtime.data_eval;
+    }
   }
+
   object->base_flag = base_flag;
   object->base_local_view_bits = base_local_view_bits;
   /* Restore modifier's runtime data.



More information about the Bf-blender-cvs mailing list