[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