[Bf-blender-cvs] [8683a4ba408] master: Fix T59924: Blender 2.8 particle system error

Sergey Sharybin noreply at git.blender.org
Tue Jan 29 10:39:34 CET 2019


Commit: 8683a4ba40831e1436edc889299f062659af6712
Author: Sergey Sharybin
Date:   Tue Jan 29 10:16:16 2019 +0100
Branches: master
https://developer.blender.org/rB8683a4ba40831e1436edc889299f062659af6712

Fix T59924: Blender 2.8 particle system error

Was missing relation from particle keyed targets to the
particle system, which caused some race conditions.

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

M	source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations.cc

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

diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index d44e41168a0..85745f36ec1 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -1155,6 +1155,20 @@ void DepsgraphNodeBuilder::build_particle_systems(Object *object,
 		                   NULL,
 		                   DEG_OPCODE_PARTICLE_SYSTEM_EVAL,
 		                   psys->name);
+		/* Keyed particle targets. */
+		if (part->phystype == PART_PHYS_KEYED) {
+			LISTBASE_FOREACH (ParticleTarget *, particle_target, &psys->targets) {
+				if (particle_target->ob == NULL ||
+				    particle_target->ob == object)
+				{
+					continue;
+				}
+				build_object(-1,
+				             particle_target->ob,
+				             DEG_ID_LINKED_INDIRECTLY,
+				             is_object_visible);
+			}
+		}
 		/* Visualization of particle system. */
 		switch (part->ren_as) {
 			case PART_DRAW_OB:
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index 42229a43428..795a7d2a4ef 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -1732,32 +1732,28 @@ void DepsgraphRelationBuilder::build_particle_systems(Object *object)
 	/* Particle systems. */
 	LISTBASE_FOREACH (ParticleSystem *, psys, &object->particlesystem) {
 		ParticleSettings *part = psys->part;
-
 		/* Build particle settings relations.
-		 *
-		 * NOTE: The call itself ensures settings are only build once.
-		 */
+		 * NOTE: The call itself ensures settings are only build once. */
 		build_particle_settings(part);
-
 		/* This particle system. */
 		OperationKey psys_key(&object->id,
 		                      DEG_NODE_TYPE_PARTICLE_SYSTEM,
 		                      DEG_OPCODE_PARTICLE_SYSTEM_EVAL,
 		                      psys->name);
-
 		/* Update particle system when settings changes. */
 		OperationKey particle_settings_key(&part->id,
 		                                   DEG_NODE_TYPE_PARTICLE_SETTINGS,
 		                                   DEG_OPCODE_PARTICLE_SETTINGS_EVAL);
-		add_relation(particle_settings_key, eval_init_key, "Particle Settings Change");
+		add_relation(particle_settings_key,
+		             eval_init_key,
+		             "Particle Settings Change");
 		add_relation(eval_init_key, psys_key, "Init -> PSys");
 		add_relation(psys_key, eval_done_key, "PSys -> Done");
 		/* TODO(sergey): Currently particle update is just a placeholder,
 		 * hook it to the ubereval node so particle system is getting updated
-		 * on playback.
-		 */
+		 * on playback. */
 		add_relation(psys_key, obdata_ubereval_key, "PSys -> UberEval");
-		/* Collisions */
+		/* Collisions. */
 		if (part->type != PART_HAIR) {
 			add_particle_collision_relations(psys_key,
 			                                 object,
@@ -1765,8 +1761,8 @@ void DepsgraphRelationBuilder::build_particle_systems(Object *object)
 			                                 "Particle Collision");
 		}
 		else if ((psys->flag & PSYS_HAIR_DYNAMICS) &&
-		         psys->clmd != NULL &&
-		         psys->clmd->coll_parms != NULL)
+		          psys->clmd != NULL &&
+		          psys->clmd->coll_parms != NULL)
 		{
 			add_particle_collision_relations(psys_key,
 			                                 object,
@@ -1781,7 +1777,7 @@ void DepsgraphRelationBuilder::build_particle_systems(Object *object)
 		                                  part->type == PART_HAIR,
 		                                  "Particle Field");
 		/* Boids .*/
-		if (part->boids) {
+		if (part->boids != NULL) {
 			LISTBASE_FOREACH (BoidState *, state, &part->boids->states) {
 				LISTBASE_FOREACH (BoidRule *, rule, &state->rules) {
 					Object *ruleob = NULL;
@@ -1791,7 +1787,7 @@ void DepsgraphRelationBuilder::build_particle_systems(Object *object)
 					else if (rule->type == eBoidRuleType_FollowLeader) {
 						ruleob = ((BoidRuleFollowLeader *)rule)->ob;
 					}
-					if (ruleob) {
+					if (ruleob != NULL) {
 						ComponentKey ruleob_key(&ruleob->id,
 						                        DEG_NODE_TYPE_TRANSFORM);
 						add_relation(ruleob_key, psys_key, "Boid Rule");
@@ -1799,6 +1795,24 @@ void DepsgraphRelationBuilder::build_particle_systems(Object *object)
 				}
 			}
 		}
+		/* Keyed particle targets. */
+		if (part->phystype == PART_PHYS_KEYED) {
+			LISTBASE_FOREACH (ParticleTarget *, particle_target, &psys->targets) {
+				if (particle_target->ob == NULL ||
+				    particle_target->ob == object)
+				{
+					continue;
+				}
+				/* Make sure target object is pulled into the graph. */
+				build_object(NULL, particle_target->ob);
+				/* Use geometry component, since that's where particles are
+				 * actually evaluated. */
+				ComponentKey target_key(&particle_target->ob->id,
+				                        DEG_NODE_TYPE_GEOMETRY);
+				add_relation(target_key, psys_key, "Keyed Target");
+			}
+		}
+		/* Visualization. */
 		switch (part->ren_as) {
 			case PART_DRAW_OB:
 				if (part->dup_ob != NULL) {
@@ -1820,13 +1834,11 @@ void DepsgraphRelationBuilder::build_particle_systems(Object *object)
 				break;
 		}
 	}
-
 	/* Particle depends on the object transform, so that channel is to be ready
 	 * first.
 	 *
 	 * TODO(sergey): This relation should be altered once real granular update
-	 * is implemented.
-	 */
+	 * is implemented. */
 	ComponentKey transform_key(&object->id, DEG_NODE_TYPE_TRANSFORM);
 	add_relation(transform_key, obdata_ubereval_key, "Particle Eval");
 }



More information about the Bf-blender-cvs mailing list