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");
}
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs