[Bf-blender-cvs] [549f43e928b] blender2.8: Depsgraph: Attempt to keep evaluated mesh when possible

Sergey Sharybin noreply at git.blender.org
Thu Jul 27 15:23:12 CEST 2017


Commit: 549f43e928bc3e21c1c570858f0bdef0b96e206b
Author: Sergey Sharybin
Date:   Thu Jul 27 15:12:08 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB549f43e928bc3e21c1c570858f0bdef0b96e206b

Depsgraph: Attempt to keep evaluated mesh when possible

Currently wouldn't make any difference, but required for upcoming work of
getting rid of time dependency for copy-on-write component.

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

M	source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc

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

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 607397bb42a..a0642210664 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
@@ -770,6 +770,7 @@ ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph,
                                        const IDDepsNode *id_node)
 {
 	const ID *id_orig = id_node->id_orig;
+	const short id_type = GS(id_orig->name);
 	ID *id_cow = id_node->id_cow;
 	/* Similar to expansion, no need to do anything here. */
 	if (!deg_copy_on_write_is_needed(id_orig)) {
@@ -793,8 +794,9 @@ ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph,
 	 */
 	ListBase gpumaterial_backup;
 	ListBase *gpumaterial_ptr = NULL;
+	Mesh *mesh_evaluated = NULL;
 	if (check_datablock_expanded(id_cow)) {
-		switch (GS(id_orig->name)) {
+		switch (id_type) {
 			case ID_MA:
 			{
 				Material *material = (Material *)id_cow;
@@ -807,6 +809,23 @@ ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph,
 				gpumaterial_ptr = &world->gpumaterial;
 				break;
 			}
+			case ID_OB:
+			{
+				Object *object = (Object *)id_cow;
+				/* Store evaluated mesh, make sure we don't free it. */
+				mesh_evaluated = object->mesh_evaluated;
+				object->mesh_evaluated = 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_evaluated != NULL) {
+					if (object->data == mesh_evaluated) {
+						object->data = mesh_evaluated->id.newid;
+					}
+				}
+				break;
+			}
 		}
 		if (gpumaterial_ptr != NULL) {
 			gpumaterial_backup = *gpumaterial_ptr;
@@ -819,6 +838,18 @@ ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph,
 	if (gpumaterial_ptr != NULL) {
 		*gpumaterial_ptr = gpumaterial_backup;
 	}
+	if (id_type == ID_OB) {
+		if (mesh_evaluated != NULL) {
+			Object *object = (Object *)id_cow;
+			object->mesh_evaluated = mesh_evaluated;
+			/* Do same thing as object update: override actual object data
+			 * pointer with evaluated datablock.
+			 */
+			if (object->type == OB_MESH) {
+				object->data = mesh_evaluated;
+			}
+		}
+	}
 	return id_cow;
 }




More information about the Bf-blender-cvs mailing list