[Bf-blender-cvs] [edc1e65809d] blender2.8: Add deformed evaluated mesh to object

Sergey Sharybin noreply at git.blender.org
Wed May 30 11:56:37 CEST 2018


Commit: edc1e65809d1c622a15dbe60330947149db4776f
Author: Sergey Sharybin
Date:   Wed May 30 11:49:45 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBedc1e65809d1c622a15dbe60330947149db4776f

Add deformed evaluated mesh to object

This is a first step to have correspondence of legacy derivedDeform
within a new formulation. Only base ground for now to support file
reading, copy-on-write remapping and such.

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

M	source/blender/blenkernel/BKE_object.h
M	source/blender/blenkernel/intern/object.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
M	source/blender/makesdna/DNA_object_types.h

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

diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index ab9af27bec3..f5c36550193 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -295,6 +295,8 @@ void BKE_object_data_relink(struct Object *ob);
 
 struct MovieClip *BKE_object_movieclip_get(struct Scene *scene, struct Object *ob, bool use_default);
 
+void BKE_object_runtime_reset(struct Object *object);
+
 /* this function returns a superset of the scenes selection based on relationships */
 
 typedef enum eObRelationTypes {
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 6fa8caba582..71ed9211064 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -352,6 +352,13 @@ void BKE_object_free_derived_caches(Object *ob)
 		MEM_freeN(mesh_eval);
 		ob->runtime.mesh_eval = NULL;
 	}
+	if (ob->runtime.mesh_deform_eval != NULL) {
+		Mesh *mesh_deform_eval = ob->runtime.mesh_deform_eval;
+		BKE_mesh_free(mesh_deform_eval);
+		BKE_libblock_free_data(&mesh_deform_eval->id, false);
+		MEM_freeN(mesh_deform_eval);
+		ob->runtime.mesh_deform_eval = NULL;
+	}
 
 	BKE_object_free_curve_cache(ob);
 }
@@ -3344,6 +3351,9 @@ MovieClip *BKE_object_movieclip_get(Scene *scene, Object *ob, bool use_default)
 	return clip;
 }
 
+void BKE_object_runtime_reset(Object *object) {
+	memset(&object->runtime, 0, sizeof(object->runtime));
+}
 
 /*
  * Find an associated Armature object
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index bc4b8daf0d3..00e22cbb911 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5523,6 +5523,7 @@ static void direct_link_object(FileData *fd, Object *ob)
 	ob->bb = NULL;
 	ob->derivedDeform = NULL;
 	ob->derivedFinal = NULL;
+	BKE_object_runtime_reset(ob);
 	BLI_listbase_clear(&ob->gpulamp);
 	BLI_listbase_clear(&ob->drawdata);
 	link_list(fd, &ob->pc_ids);
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
index 4d9f1f6b977..ad7467ffbdc 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
@@ -693,6 +693,64 @@ static void deg_update_copy_on_write_animation(const Depsgraph *depsgraph,
 	                            IDWALK_NOP);
 }
 
+typedef struct ObjectRuntimeBackup {
+	CurveCache *curve_cache;
+	Object_Runtime runtime;
+	short base_flag;
+} ObjectRuntimeBackup;
+
+/* Make a backup of object's evaluation runtime data, additionally
+ * male object to be safe for free without invalidating backed up
+ * pointers.
+ */
+static void deg_backup_object_runtime(
+        Object *object,
+        ObjectRuntimeBackup *object_runtime_backup)
+{
+	/* Store evaluated mesh, and make sure we don't free it. */
+	Mesh *mesh_eval = object->runtime.mesh_eval;
+	object_runtime_backup->runtime = object->runtime;
+	BKE_object_runtime_reset(object);
+	/* Currently object update will override actual object->data
+	 * to an evaluated version. Need to make sure we don't have
+	 * data set to evaluated one before free anything.
+	 */
+	if (mesh_eval != NULL && object->data == mesh_eval) {
+		object->data = mesh_eval->id.orig_id;
+	}
+	/* Store curve cache and make sure we don't free it. */
+	object_runtime_backup->curve_cache = object->curve_cache;
+	object->curve_cache = NULL;
+	/* Make a backup of base flags. */
+	object_runtime_backup->base_flag = object->base_flag;
+}
+
+static void deg_restore_object_runtime(
+        Object *object,
+        const ObjectRuntimeBackup *object_runtime_backup)
+{
+	object->runtime = object_runtime_backup->runtime;
+	if (object->runtime.mesh_eval != NULL) {
+		Mesh *mesh_eval = object->runtime.mesh_eval;
+		/* Do same thing as object update: override actual object data
+		 * pointer with evaluated datablock.
+		 */
+		if (object->type == OB_MESH) {
+			object->data = mesh_eval;
+			/* Evaluated mesh simply copied edit_btmesh pointer from
+			 * original mesh during update, need to make sure no dead
+			 * pointers are left behind.
+			 */
+			Mesh *mesh = ((Mesh *)mesh_eval->id.orig_id);
+			mesh_eval->edit_btmesh = mesh->edit_btmesh;
+		}
+	}
+	if (object_runtime_backup->curve_cache != NULL) {
+		object->curve_cache = object_runtime_backup->curve_cache;
+	}
+	object->base_flag = object_runtime_backup->base_flag;
+}
+
 ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph,
                                        const IDDepsNode *id_node)
 {
@@ -716,9 +774,7 @@ ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph,
 	 */
 	ListBase gpumaterial_backup;
 	ListBase *gpumaterial_ptr = NULL;
-	Mesh *mesh_eval = NULL;
-	CurveCache *curve_cache = NULL;
-	short base_flag = 0;
+	ObjectRuntimeBackup object_runtime_backup = {NULL};
 	if (check_datablock_expanded(id_cow)) {
 		switch (id_type) {
 			case ID_MA:
@@ -753,28 +809,9 @@ ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph,
 				break;
 			}
 			case ID_OB:
-			{
-				Object *object = (Object *)id_cow;
-				/* Store evaluated mesh, make sure we don't free it. */
-				mesh_eval = object->runtime.mesh_eval;
-				object->runtime.mesh_eval = NULL;
-				/* Currently object update will override actual object->data
-				 * to an evaluated version. Need to make sure we don't have
-				 * data set to evaluated one before free anything.
-				 */
-				if (mesh_eval != NULL) {
-					if (object->data == mesh_eval) {
-						object->data = mesh_eval->id.orig_id;
-					}
-				}
-				/* Store curve cache and make sure we don't free it. */
-				curve_cache = object->curve_cache;
-				object->curve_cache = NULL;
-
-				/* Make a backup of base flags. */
-				base_flag = object->base_flag;
+				deg_backup_object_runtime((Object *)id_cow,
+				                          &object_runtime_backup);
 				break;
-			}
 			default:
 				break;
 		}
@@ -790,26 +827,7 @@ ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph,
 		*gpumaterial_ptr = gpumaterial_backup;
 	}
 	if (id_type == ID_OB) {
-		Object *object = (Object *)id_cow;
-		if (mesh_eval != NULL) {
-			object->runtime.mesh_eval = mesh_eval;
-			/* Do same thing as object update: override actual object data
-			 * pointer with evaluated datablock.
-			 */
-			if (object->type == OB_MESH) {
-				object->data = mesh_eval;
-				/* Evaluated mesh simply copied edit_btmesh pointer from
-				 * original mesh during update, need to make sure no dead
-				 * pointers are left behind.
-				 */
-				mesh_eval->edit_btmesh =
-				        ((Mesh *)mesh_eval->id.orig_id)->edit_btmesh;
-			}
-		}
-		if (curve_cache != NULL) {
-			object->curve_cache = curve_cache;
-		}
-		object->base_flag = base_flag;
+		deg_restore_object_runtime((Object *)id_cow, &object_runtime_backup);
 	}
 	return id_cow;
 }
diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h
index e525a4fae0c..daff6ab0baa 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -149,6 +149,10 @@ typedef struct Object_Runtime {
 	 * It has all modifiers applied.
 	 */
 	struct Mesh *mesh_eval;
+	/* Mesh structure created during object evaluation.
+	 * It has deforemation only modifiers applied on it.
+	 */
+	struct Mesh *mesh_deform_eval;
 } Object_Runtime;
 
 typedef struct Object {



More information about the Bf-blender-cvs mailing list